标签:cimage 空间 bcb 表示 著作权 top strip 树的定义 哈夫曼
五、树
























//先序遍历递归算法void preorder(Tree t){ if(t==null) return; visit(t); preorder(t.left()); preorder(t.right());}//先序遍历非递归算法void PreOrderUnrec(Bitree t){ //创建栈来存放树的结点 SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { visite(p->data); push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s); p=p->rchild; }//endif }//endwhile }//PreOrderUnrec//中序遍历递归算法void inorder(Tree t){ if(t==null) return; inorder(t.left()); visit(t); inorder(t.right());}void InOrderUnrec(Bitree t){ //创建栈来存放树的结点 SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s); visite(p->data); //访问根节点 p=p->rchild; }//endif }//endwhile }//InOrderUnrec后序遍历递归算法void inorder(Tree t){ if(t==null) return; inorder(t.left()); inorder(t.right()); visit(t);}//后序遍历非递归算法对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。void postOrder2(BinTree *root) //非递归后序遍历{ stack<BTNode*> s; BinTree *p=root; BTNode *temp; while(p!=NULL||!s.empty()) { while(p!=NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点 { BTNode *btn=(BTNode *)malloc(sizeof(BTNode)); btn->btnode=p; btn->isFirst=true; s.push(btn); p=p->lchild; } if(!s.empty()) { temp=s.top(); s.pop(); if(temp->isFirst==true) //表示是第一次出现在栈顶 { temp->isFirst=false; s.push(temp); p=temp->btnode->rchild; } else //第二次出现在栈顶 { cout<<temp->btnode->data<<" "; p=NULL; } } } }























标签:cimage 空间 bcb 表示 著作权 top strip 树的定义 哈夫曼
原文地址:http://www.cnblogs.com/java2016/p/7636842.html