# 一、概念
### 1.二叉树
(1)用域p、left、right来存放指向二叉树T中的父亲、左儿子、右儿子。没有则为NULL。
(2)结点结构
~~~
struct node
{
node *p;
node *left;
node *right;
int key;
};
~~~
(3)树的结构
~~~
struct Bin_Tree
{
node *head;
};
~~~
### 2.分支数无限的有根树
(1)左孩子右兄弟表示法
(2)结点结构
~~~
struct node
{
node *p;
node *left_child;
node *right_sibling;
int key;
};
~~~
(3)树的结构
~~~
struct Tree
{
node *head;
};
~~~
# 二、练习
10.4-2
[算法导论 10.4-2 O(n)时间 递归遍历二叉树](http://blog.csdn.net/mishifangxiangdefeng/article/details/39010925)
~~~
TREE-PRINT(T)
1 print key[T]
2 if left[T] != NIL
3 TREE-PRINT(left[T])
4 if right[T] != NIL
5 TREE-PRINT(right[T])
~~~
10.4-3
[算法导论 10.4-3 O(n) 二叉树 非递归遍历](http://blog.csdn.net/mishifangxiangdefeng/article/details/39012249)
~~~
TREE-PRINT(T, S)
1 print key[T]
2 PUSH(S, T)
3 while true
4 if left[T] != NIL
5 then T <- left[T]
6 else
7 do
8 T = POP(S)
9 if T = NIL
10 then return
11 while left[T] = NIL
12 T <- right[T]
~~~
10.4-4
与二叉树的遍历过程相同
10.4-5
见[算法导论-10.4-5](http://blog.csdn.net/mishifangxiangdefeng/article/details/7708490)
采用类似中序遍历的处理方法,对一个结点,可以分为以下几种情况
1.从父结点进入子结点进行处理
(1)如果有左孩子,就处理左孩子
(2)返回到自己
(3)访问自己
(4)如果有右孩子,就处理右孩子
(5)返回到自己的父结点
2.从左孩子返回,说明左孩子已经处理过,自己还没访问,自己的右孩子也没有处理过,就进行1-(2)
3.从右孩子返回,说明左右孩子都已经处理,自己也访问过,就返回到更上层
4.返回到根结点时,遍历结束
10.4-6
去掉parent指针,当布尔值为1时,rightchild指向父结点,当布尔值为0值,rightchild指向右兄弟,其余用法保持不变
- 前言
- 第6章 堆排序
- 6-3 Young氏矩阵
- 第7章 快速排序
- 第8章 线性时间排序
- 第9章 排序和顺序统计学算法导论
- 算法导论 9.1-1 求第二小元素
- 第10章 10.1 栈和队列
- 第10章 10.2 链表
- 第10章 10.3 指针和对象实现
- 第10章 10.4 有根树的表示
- 第11章-散列表
- 第12章 二叉查找树
- 第13章 红黑树
- 第14章 14.1 动态顺序统计
- 算法导论-14-1-最大重叠点
- 算法导论-14-2-Josephus排列
- 第14章 14.3 区间树
- 第15章 动态规划
- 第16章 贪心算法
- 第18章 B树
- 第19章-二项堆
- 第20章 斐波那契堆
- 第21章 用于不相交集合的数据结构
- 第22章 图的基本算法 22.1 图的表示
- 第22章 图算法 22.2 广度优先搜索
- 第22章 图算法 22.3 深度优先搜索
- 第22章 图的基本算法 22.4 拓扑排序
- 第22章 图的基本算法 22.5 强联通分支