zoukankan      html  css  js  c++  java
  • 二叉树遍历非递归算法——先序遍历

      二叉树是一种很重要的数据结构,在互联网面试笔试中,二叉树都是考察的重点和难点。很多关于二叉树的问题都涉及到了二叉树的遍历,根据二叉树根结点被访问

    的顺序,可以将二叉树的遍历分为:先序遍历(根、左、右),中序遍历(左、根、右),后序遍历(左、右、根)。二叉树遍历的算法可以采用递归来实现,也可以采用非递归

    的方式来实现。由于采用递归的方式实现二叉树的遍历太简单,因此在这里直接略过,着重掌握二叉树遍历的非递归算法。

      先序遍历二叉树的时候,首先访问根结点,再访问左孩子,最后访问右孩子。在二叉树先序遍历非递归算法中,先将根结点压栈,在栈不为空的时候执行循环:

    让栈顶元素p出栈,访问栈顶元素p,如果p的右孩子不为空,则让其右孩子先进栈,如果p的左孩子不为空,则再让其左孩子进栈(注意:进栈顺序一定是先右

    孩子,再左孩子)

      二叉树先序遍历的非递归算法实现如下:

      

    #include <stdlib.h>
    #include <stdio.h>
    #define MAXSIZE 100
    // 定义结点类型
    typedef struct node
    {
        int data;
        struct node* lchild;
        struct node* rchild;
    } BTnode;
    
    void Preorder(BTnode* t)
    {
        BTnode* Seqstack[MAXSIZE];         
        int top = -1;
        BTnode* p;
        
        if(t != NULL)
        {
            top++;
            Seqstack[top] = t;                      // 先将根结点压栈
            while(top > -1)                         // 栈不为空时循环
            {
                p = Seqstack[top];                  // 栈顶元素出栈
                top --;
                printf("%d ", p->data);             // 访问栈顶元素
                if(p->rchild != NULL)               // 如果右孩子不为空,则进栈
                {
                    top ++;
                    Seqstack[top] = p->rchild;
                }
                if(p->lchild != NULL)               // 如果左孩子不为空,则进栈
                {
                    top ++;
                    Seqstack[top] = p->lchild;
                }
            }
        }
    }
  • 相关阅读:
    Mycat适合场景及不适合场景
    solr与Elasticsearch对比
    分布式搜索之搭建Solrcloud(Solr集群)
    Mysql索引最左匹配原则
    CAS实现单点登录SSO执行原理及部署
    Spring Cloud,Dubbo及HSF对比
    Dubbo支持的协议的详解
    Dubbo架构设计详解
    几种分布式锁的实现方式
    深入分析volatile的实现原理
  • 原文地址:https://www.cnblogs.com/greedyco/p/7182555.html
Copyright © 2011-2022 走看看