1、o(n)时间遍历二叉树的递归方法
-
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])
2、o(n)时间非递归遍历二叉树,借用了栈作为辅助结构
-
//把x结点压入栈S的顶部
-
void Push(node *S, node x)
-
{
-
S[0].key++;
-
S[S[0].key] = x;
-
}
-
//弹出栈顶元素并返回
-
node* Pop(node *S)
-
{
-
if(S[0].key == 0)
-
return NULL;
-
node *ret = &S[S[0].key];
-
S[0].key--;
-
return ret;
-
}
-
//用非递归的方式遍历二叉树
-
void Tree_Print2(tree *T)
-
{
-
//这种方式要借助一个栈来实现,栈的大小为树的深度
-
node Stack[15] = {0};//简单的数组栈,Stack[0]存储栈顶位置
-
node *t = T->root;
-
//当处理一个结点时,做如下处理
-
while(1)
-
{
-
//访问这个结点
-
cout<<t->key<<' ';
-
//入栈
-
Push(Stack, *t);
-
//如果有左孩子,下一步处理其左孩子
-
if(t->left)
-
t = t->left;
-
//如果没有左孩子
-
else
-
{
-
do{
-
//弹出栈顶元素
-
t = Pop(Stack);
-
//若栈中元素已经全部弹出,那么二叉树访问结束了
-
if(t == NULL)
-
{
-
cout<<endl;
-
return;
-
}
-
}
-
//如果这个栈顶元素没有右孩子,则继续出栈,直到访问结束或找到一个有右孩子的元素
-
while(t->right == NULL);
-
//如果这个栈顶元素有右孩子,则访问其右孩子
-
t = t->right;
-
}
-
}
-
}
3、 O(n)时间非递归遍历二叉树
采用类似中序遍历的处理方法,对一个结点,可以分为以下几种情况
1.从父结点进入子结点进行处理
(1)如果有左孩子,就处理左孩子
(2)返回到自己
(3)访问自己
(4)如果有右孩子,就处理右孩子
(5)返回到自己的父结点
2.从左孩子返回,说明左孩子已经处理过,自己还没访问,自己的右孩子也没有处理过,就进行1-(2)
3.从右孩子返回,说明左右孩子都已经处理,自己也访问过,就返回到更上层
4.返回到根结点时,遍历结束
阅读(1543) | 评论(0) | 转发(1) |