[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.
分类
常用二叉树有:
完全二叉树,平衡二叉树,红黑树,满二叉树等
二叉树有4种遍历方式
- 前序遍历:
首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树
- 中序遍历:
首先中序遍历左(右)子树,再访问根,最后中序遍历右(左)子树
- 后序遍历:
首先后序遍历左(右)子树,再后序遍历右(左)子树,最后访问根
- 层次遍历:
即按照层次访问,访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同,通常先左后右)
CODE
先抽象出树实体
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80package test;
/**
* 树的模型
*
* @author lxz
*
*/
public class Tree {
private Tree leftTree;// 左子树
private Tree rightTree;// 右子树
private Object data;// 节点数据
public Tree() {
}
public Tree(Object data) {
this.data = data;
}
/*
* 求data所对应结点的层数,
* 如果对象不在树中,结果返回-1;
* 否则结果返回该对象在树中所处的层次,
* 规定根节点为第一层
*/
public int level(Object data) {
int leftLevel, rightLevel;
if (this == null)
return -1;
if (data == this.data)
return 1;
leftLevel = leftTree == null ? -1 : leftTree.level(data);
rightLevel = rightTree == null ? -1 : rightTree.level(data);
if (leftLevel < 0 && rightLevel < 0)
return -1;
return leftLevel > rightLevel ? leftLevel + 1 : rightLevel + 1;
}
/*
* 将树中的每个节点的孩子对换位置
*/
public void exChange() {
if (this == null)
return;
if (leftTree != null)
leftTree.exChange();
if (rightTree != null)
rightTree.exChange();
Tree temp = leftTree;
leftTree = rightTree;
rightTree = temp;
}
public Tree getLeftTree() {
return leftTree;
}
public void setLeftTree(Tree leftTree) {
this.leftTree = leftTree;
}
public Tree getRightTree() {
return rightTree;
}
public void setRightTree(Tree rightTree) {
this.rightTree = rightTree;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
再写遍历树的各种算法
1 | package test; |
Test
1 | package test; |
结果
先序遍历二叉树-递归:
ABDEFGHIC
先序遍历二叉树-堆栈:
ABDEFGHIC
中序遍历二叉树-递归:
DBEIHGFAC
中序遍历二叉树-堆栈:
DBEIHGFAC
后序遍历二叉树-递归:
DIHGFEBCA
层次遍历二叉树:
ABCDEFGHI