二叉树遍历的递归和非递归实现

爱被打了一巴掌 2021-10-30 01:54 410阅读 0赞

所谓二叉树的遍历,是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问且仅被访问一次

前序遍历

1、递归实现

如果二叉树非空,则先访问根结点—左子树—右子树

  1. void PreOrder(BiTree T){
  2. if(T!=NULL){
  3. visit(T);//先访问根结点
  4. PreOrder(T->lchild); //先序遍历左子树
  5. PreOrder(T->rchild); //先序遍历右子树
  6. }
  7. }

2、非递归实现

借助栈实现

  1. void PreOrder(BiTree T){
  2. InitStack(s);//初始化一个栈
  3. BiTree p=T;//初始化一个遍历指针
  4. while(p!=NULL||StackEmpty(s)!=NULL){//当p非空,或者栈非空时
  5. if(p!=NULL){
  6. visit(p); //先访问根结点
  7. Push(S,p);//将当前节点入栈
  8. p=p->lchild;
  9. }else{ //此时p的左子树均已访问
  10. Pop(S,p); //将栈顶元素出栈
  11. p=p->rchild;
  12. }
  13. }
  14. }

中序遍历

递归实现

  1. void InOrder(BiTree T){
  2. if(T!=NULL){
  3. InOrder(T->lchild);
  4. visit(T);
  5. InOrder(T->rchild);
  6. }
  7. }

非递归实现

  1. void InOrder(BiTree T){
  2. InitStack(S);
  3. BiTree p=T;
  4. while(p!=NULL||StackEmpty(S)!=NULL){
  5. if(p!=NULL){
  6. Push(S,p);//将p入栈
  7. p=p->lchild;
  8. }else{
  9. Pop(S,p);
  10. visit(p);
  11. p=p->rchild;
  12. }
  13. }
  14. }

后序遍历

递归实现

  1. void PostOrder(BiTree T){
  2. if(T!=NULL){
  3. PostOrder(T->lchild);
  4. PostOrder(T->rchild);
  5. visit(T);
  6. }
  7. }

非递归实现

  1. void PostOrder(BiTree T){
  2. InitStack(S);
  3. BiTree p=T;q=NULL; //设置一个p指针用来标识当前结点的右子树是否被访问
  4. while(p!=NULL||StackEmpty(S)!=NULL){
  5. if(p!=NULL){
  6. Push(S,p);
  7. p=p->lchild;
  8. }else{
  9. GetTop(s,p);//取栈顶元素
  10. if(p->rchild==NULL||p->rchild==q){//p的右子树为空或者p的右子树已经被访问
  11. visit(P);
  12. Pop(S,p);
  13. q=p;
  14. p=NULL;//将p设置为空是为了继续读取下一个栈顶元素
  15. }else{
  16. p=p->rchild;
  17. }
  18. }
  19. }
  20. }

发表评论

表情:
评论列表 (有 0 条评论,410人围观)

还没有评论,来说两句吧...

相关阅读