第十章:基本数据结构(2)
2013-06-20 14:36
127 查看
请写出一个O(n)时间的非递归过程,将给定的n节点二叉树中每个节点的关键字输出来。可以利用栈作为辅助数组数据结构。
中序输出
PUSH(root)
while !empty_stack(S)
if root->left
PUSH(root->left)
root<-root->left
else
root<-POP(S)
打印root数据
while !root->right&&!empty_stack(S)
root<-POP(S)
打印root数据
if root->right
PUSH(root->right)
root<-root->right
前序输出
PUSH(root)
while !empty_stack(S)
root<-POP(S)
打印root数据
if root->right
PUSH(root->right)
if root->left
PUSH(root->left)
后序输出
PUSH(root)
while !empty_stack(S)
if root->right||root->left
if root->left
if root->right
PUSH(root->right)
PUSH(root->left)
root<-root->left
else
PUSH(root->right)
root<-root->right
else
root<-POP(S)
打印root数据
while !empty_stack(S)
p=POP(S)
if p->left==root||p->right==root
打印root数据
root=p
else
root=p;
PUSH(root)
break
中序输出
PUSH(root)
while !empty_stack(S)
if root->left
PUSH(root->left)
root<-root->left
else
root<-POP(S)
打印root数据
while !root->right&&!empty_stack(S)
root<-POP(S)
打印root数据
if root->right
PUSH(root->right)
root<-root->right
前序输出
PUSH(root)
while !empty_stack(S)
root<-POP(S)
打印root数据
if root->right
PUSH(root->right)
if root->left
PUSH(root->left)
后序输出
PUSH(root)
while !empty_stack(S)
if root->right||root->left
if root->left
if root->right
PUSH(root->right)
PUSH(root->left)
root<-root->left
else
PUSH(root->right)
root<-root->right
else
root<-POP(S)
打印root数据
while !empty_stack(S)
p=POP(S)
if p->left==root||p->right==root
打印root数据
root=p
else
root=p;
PUSH(root)
break
typedef int Data; struct TreeNode{ Data data; TreeNode *left; TreeNode *right; }; /* 建立一棵num个元素的有序二叉树 */ TreeNode *create_tree(int num){ TreeNode *root,*p,*child,*parent; int i=0; p=(TreeNode *)malloc(sizeof(TreeNode)); p->left=p->right=NULL; cin>>p->data; child=root=p; while (++i<num){ p=(TreeNode *)malloc(sizeof(TreeNode)); p->left=p->right=NULL; cin>>p->data; while (child){ parent=child; if ((p->data)>(child->data)){ child=child->right; }else{ child=child->left; } } if (p->data>parent->data){ parent->right=p; }else{ parent->left=p; } child=root; } return root; }
//非递归中序输出 void midOrder(TreeNode *t){ Stack s={0}; TreeNode *p=NULL; push(&s,t); while(!empty_stack(&s)){ if (t->left){ push(&s,t->left); t=t->left; }else{ t=pop(&s); cout<<t->data<<ends; while (!(t->right)&&!empty_stack(&s)){ t=pop(&s); cout<<t->data<<ends; } if (t->right){ push(&s,t->right); t=t->right; } } } } //非递归前序输出 void preOrder(TreeNode *t){ Stack s={0}; TreeNode *p=NULL; push(&s,t); while (!empty_stack(&s)){ t=pop(&s); cout<<t->data<<ends; if (t->right){ push(&s,t->right); } if (t->left){ push(&s,t->left); } } } //非递归后序输出 void postOrder(TreeNode *t){ Stack s={0}; TreeNode *p=NULL; push(&s,t); while (!empty_stack(&s)){ if (t->left||t->right){ //如果t有孩子,则将孩子入栈 if (t->left){ if (t->right){ push(&s,t->right); } push(&s,t->left); t=t->left; }else{ push(&s,t->right); t=t->right; } }else{ t=pop(&s); //从栈中取出叶子节点t cout<<t->data<<ends; while (!empty_stack(&s)){ p=pop(&s); //取出上一个压入栈的节点 if (p->left==t||p->right==t){//判断该节点是不是t的父节点,如果是则输出数据 cout<<p->data<<ends; t=p; }else{ t=p; push(&s,p); break; } } } } }
相关文章推荐
- 算法导论 第十章:基本数据结构
- 第十章:基本数据结构(0)
- 算法导论第十章基本数据结构
- 第十章 基本数据结构——二叉树
- 《算法导论》第十章——基本数据结构(一):栈与队列
- 第十章 基本数据结构 练习 10.4-2
- 算法导论_第十章_基本数据结构
- 第十章 基本数据结构 练习 10.4-3
- 《算法导论》第十章----基本数据结构
- 第十章 基本数据结构 练习 10.4-4
- 第十章 基本数据结构 练习 10.4-4
- 第十章 基本数据结构
- 第十章 基本数据结构——栈和队列
- 算法导论详解(8) 第十章 基本数据结构
- 第十章 基本数据结构
- 算法导论第十章 基本数据结构实现(栈,队列,链表),课后题答案
- 算法导论 第十章 基本数据结构 练习10.1-2
- 第十章 基本数据结构 练习 10.4-3
- 第十章 基本数据结构
- 第十章 基本数据结构 练习 10.4-2