一.二叉树的定义
二.二叉树的建立
定义一棵无数据的二叉树:
6 int left[SIZE];
7 int right[SIZE];
为了操作简便,我们定义一棵不需要存储数据的二叉树,只要能存储节点之间的逻辑关系就行,所以用两个数组来表示。
left[i],第i个节点的左子节点的序号
right[i],第i个节点的右子节点的序号
若left[i] == -1表示第i个节点没有左子节点
若right[i] == -1表示第i个节点没有右子节点
先建立一棵二叉树。
1.创建根节点
2.若果要,创建左子树
3.若果要,创建右子树
8 int createTree()
9 {
10 int index;
11 scanf("%d",&index);
12 if(index == -1)
13 {
14 return -1;
15 }
16 left[index] = createTree();
17 right[index] = createTree();
18 return index;
19 }
输入-1表示该节点为空,返回-1。
三.二叉树的遍历操作
先序遍历:
1.若根节点(当前节点)不为空,访问根结点,否则返回。
2.若左子树不为空,访问左子树
3.若右子树不为空,访问右子树
43 void prior(int root)
44 {
45 if(root == -1)
46 {
47 return;
48 }
49 printf("%d\n", root);
50 prior(left[root]);
51 prior(right[root]);
52 }
上面描述了递归的先序遍历的代码,逻辑异常明显。下面写一个非递归的先序遍历代码。
先序遍历的递归代码相较于中序与后续来说是较为简单的,只要牢记访问的顺序是先根节点再左子树最后是右子树,左右子树的访问也是相同的。
我们可以看着递归代码来写出其对应的非递归代码,递归的好处就在于,我们不需要自己去维护一个栈。
仔细分析上面的代码,这个我们看不见