树
定义:二叉树是n(n>0)个节点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交分别称为根节点的左子树和右子树的二叉树组成。
注意:
- n>0 时节点是唯一的,不可能存在多个节点,别和现实中的树木混在一起。
- m>0 时,子树的个数没有限制,但是一定是不交互的。
树的四种遍历
遍历:二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点被访问依次且被访问依次。
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
前序遍历
定义:规则是若二叉树为空,则空操作返回。 否则先访问跟节点,然后前序遍历左子树,再遍历右子树。优先级:根->左->右
中序遍历
定义:规则是树若为空,操作返回,否则从根节点开始,中序遍历(注意并不是访问根节点)根节点的左子树,然后访问根节点,最后中序遍历右子树。优先级:左->根->右
后序遍历
定义:规则是若树空,操作返回,否则是从左到右先叶子后节点的方式遍历访问左右子树,最后是访问跟节点。优先级:左->右->根
层序遍历
定义:规则是若树空,操作返回,否则是从树的第一层,也就是从根节点开始访问,从上而下逐层遍历,在同一层中,从左到右的顺序对节点逐个访问。优先级:左->右->根
代码示例4中遍历
1 |
|
每一种遍历其实都是递归,只是递归的时候,处理数据的代码时机不一样。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//前序 遍历
/*
规则是若二叉树为空,则空操作返回。 否则先访问跟节点,然后前序遍历左子树,再遍历右子树。跟->左->右
*/
-(void)printNode:(Node *)node{
if (node == nil) {
return;
}
NSLog(@"%ld",node.data);
[self printNode:node.leftNode];
[self printNode:node.rightNode];
}
// 中序遍历 从 左子树【左->跟->右】
-(void)printCenterNode:(Node *)node{
if (node == nil) {
return;
}
[self printCenterNode:node.leftNode];
NSLog(@"%ld",node.data);
[self printCenterNode:node.rightNode];
}
// 后序遍历 从 左子树【左->右->跟】
-(void)print2Node:(Node *)node{
if (node == nil) {
return;
}
[self print2Node:node.leftNode];
[self print2Node:node.rightNode];
NSLog(@"%ld",node.data);//节点数据可以进行其他操作
}
/*
层序遍历暂时没有代码示例。
*/
//构造节点
-(Node *)randNode{
Node * node =[Node new];
node.data = rand()%20 + 1;
return node;
}