Skip to content

Commit

Permalink
添加遍历二叉树的方式
Browse files Browse the repository at this point in the history
  • Loading branch information
Xiangao2018 committed Aug 27, 2024
1 parent db7e909 commit 22b8006
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 4 deletions.
142 changes: 142 additions & 0 deletions 数据结构/数/enumerate.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
#include <iostream>
#include <string>
#include <queue>

using namespace std;

struct Node
{
Node(string name): name(name) {}
string name;
Node *left;
Node *right;
};


void preOrderPrint(Node *node)
{
if( node == NULL )
return;

std::cout << node->name << " ";

preOrderPrint(node->left);
preOrderPrint(node->right);
}

void inOrderPrint(Node *node)
{
if ( node == NULL)
return;

inOrderPrint(node->left);
std::cout << node->name << " ";
inOrderPrint(node->right);
}


void postOrderPrint(Node *node)
{
if ( node == NULL)
return;

postOrderPrint(node->left);
postOrderPrint(node->right);
std::cout << node->name << " ";
}

void levelOrderPrint1(Node *node)
{
if( node == NULL )
return;

std::queue<Node *> q;
q.push(node);

Node *current = NULL;
while( !q.empty() )
{
current = q.front();
std::cout << current->name << " ";
if( current->left != NULL )
q.push(current->left);
if( current->right != NULL )
q.push(current->right);

q.pop();
}
}

void levelOrderPrint2(Node *node)
{
if( node == NULL )
return;

std::vector<Node *>v1;
v1.push_back(node);

Node *current = NULL;
while( v1.size() != 0)
{
current = v1.front();
v1.erase(v1.begin());

std::cout << current->name << " ";
if( current->left != NULL )
v1.push_back(current->left);
if( current->right != NULL )
v1.push_back(current->right);
}

// int start = 0;
// while( start < v1.size() )
// {
// current = v1[start++];
// std::cout << current->name << " ";
// if( current->left != NULL )
// v1.push_back(current->left);
// if( current->right != NULL )
// v1.push_back(current->right);
// }

// for( auto iter = v1.begin(); iter != v1.end(); iter++)
// {
// std::cout << (*iter)->name << " ";
// }
}



int main(int argc, char const *argv[])
{
Node A("A");
Node B("B");
Node C("C");
Node D("D");
Node E("E");
Node F("F");
Node G("G");

A.left = &B;
A.right = &C;
B.left = &D;
B.right = &E;
C.left = &F;
C.right = &G;


preOrderPrint(&A);
std::cout << std::endl;
inOrderPrint(&A);
std::cout << std::endl;
postOrderPrint(&A);
std::cout << std::endl;
levelOrderPrint1(&A);
std::cout << std::endl;
levelOrderPrint2(&A);




return 0;
}
15 changes: 15 additions & 0 deletions 数据结构/数/数-基本内容.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# 基本内容

树是一种非线性结构,树主要由几点构成

1. 树上的每个元素叫”节点“
2. 节点之间的连接关系,表示为父子节点关系,节点之间的连接叫边
3. 根节点没有父节点,没有子节点的节点叫为叶子节点
4. 同一个父节点的子节点称为兄弟节点

树的概念:
+ 节点的层:从根节点到该节点的层数,根节点为 1 层
+ 节点的高度:节点到最长叶子节点边的个数
+ 节点的深度:根节点到该节点经过边的个数
+ 节点的度:子节点的个数
+ 树的高度: 顶点到最长叶子节点经过的边的个数
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
>
>这里有段非常简单的代码,求 1,2,3…n 的累加和。现在,我就带你一块来估算一下这段代码的执行时间。
> ```c
```c
int cal(int n) {
int sum = 0;
int i = 1;
Expand All @@ -52,13 +52,14 @@ int cal(int n) {
}
return sum;
}
> ```
```
> 从 CPU 的角度来看,这段代码的每一行都执行着类似的操作:读数据-运算-写数据。尽管每行代码对应的 CPU 执行的个数、执行的时间都不一样,但是,我们这里只是粗略估计,所以可以假设每行代码执行的时间都一样,为 unit_time。在这个假设的基础之上,这段代码的总执行时间是多少呢?
>
> 第 2、3 行代码分别需要 1 个 unit_time 的执行时间,第 4、5 行都运行了 n 遍,所以需要 2n*unit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)*unit_time。可以看出来,**所有代码的执行时间 T(n) 与每行代码的执行次数成正比。**
>
> 按照这个分析思路,我们再来看这段代码。
> ```c
```c
int cal(int n) {
int sum = 0;
int i = 1;
Expand All @@ -70,7 +71,8 @@ int cal(int n) {
}
}
}
> ```
```
> 我们依旧假设每个语句的执行时间是 unit_time。那这段代码的总执行时间 T(n) 是多少呢?
>
> 第 2、3、4 行代码,每行都需要 1 个 unit_time 的执行时间,第 5、6 行代码循环执行了 n 遍,需要 2n * unit_time 的执行时间,第 7、8 行代码循环执行了 n<sup>2</sup>遍,所以需要 2n<sup>2</sup> * unit_time 的执行时间。所以,整段代码总的执行时间 T(n) = (2n<sup>2</sup>+2n+3)*unit_time。
Expand Down

0 comments on commit 22b8006

Please sign in to comment.