您的位置:首页 > 理论基础 > 数据结构算法

第十章:基本数据结构(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

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;
}
}
}
}
}


   

    

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: