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;
                }
            }
        }
    }
  • 相关阅读:
    SQLite3 of python
    爬虫半成品
    python初体验 ——>>> 模拟体育竞技
    文件操作
    numpy 库简单使用
    numpy 与 matplotlib 的应用
    面向对象的详细解读
    使用python进行微信好友分析
    我的第一个爬虫实验
    排球训练营
  • 原文地址:https://www.cnblogs.com/greedyco/p/7182555.html
Copyright © 2011-2022 走看看