二叉树
定义:每个结点最多有两个子树的树
1
2
3
4
5
6 |
struct
TreeNode { int
val; TreeNode *left; TreeNode *right; TreeNode( int
x) : val(x), left(NULL), right(NULL) {} }; |
基本操作:
1. 先序遍历 :先访问根节点,在访问左子树,最后访问右子树
1
2
3
4
5
6
7
8
9 |
void
PreOrderVisit(TreeNode *root) { if
(root == NULL) return ; cout << root->val << endl; PreOrderVisit(root->left); PreOrderVisit(root->right); } |
2. 中序遍历:先访问左子树,在访问根节点,最后访问右子树
1
2
3
4
5
6
7
8
9 |
void
PreOrderVisit(TreeNode *root) { if
(root == NULL) return ; PreOrderVisit(root->left); cout << root->val << endl; PreOrderVisit(root->right); } |
3. 后序遍历:先访问左子树,在访问右子树,最后访问根节点
1
2
3
4
5
6
7
8
9 |
void
PreOrderVisit(TreeNode *root) { if
(root == NULL) return ; PreOrderVisit(root->left); PreOrderVisit(root->right); cout << root->val << endl; } |
可见,所谓的前序,中序,后序遍历仅仅是由访问根节点的顺序决定。
4. 层次遍历 : 一层一层访问
借助一个队列,将每一层的结点都存放于队列中,从队列中取数据。
那么如何记录一层呢,可以通过记录每层的个数。
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 |
void
LevelVisit(TreeNode *root) { if
(root == NULL) return ; deque<TreeNode*> q; q.push_back(root); int
levelNum = 0; while
(!q.empty()) { levelNum = q.size(); while
(levelNum > 0) { TreeNode *node = q.front(); q.pop_front(); levelNum--; cout << node->val << " " ; if
(root->left != NULL) q.push_back(root->left); if
(root->right != NULL) q.push_back(root->right); } cout << endl; } } |
5. 求树的高度
1
2
3
4
5
6
7
8
9
10 |
int Height(Tree *root) { if
(root == NULL) return
0; int
lh = Height(root->left); int
rh = Height(root->right); return
max(lh, rh) + 1; } |
基本操作应该就这些,还是很简单的。
原文地址:http://www.cnblogs.com/spch2008/p/3745131.html