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;
                }
            }
        }
    }
  • 相关阅读:
    机器学习: 基于MRF和CNN的图像合成
    概率论经典问题 —— 三个事件 A、B、C 独立 ≠ 三个事件两两独立
    概率论经典问题 —— 三个事件 A、B、C 独立 ≠ 三个事件两两独立
    中国文化史
    中国文化史
    详解第一个CUDA程序kernel.cu
    【读书笔记】 —— 历史篇
    【读书笔记】 —— 历史篇
    美国政府、部门构成及其运作
    实时抢占补丁概观(待续)
  • 原文地址:https://www.cnblogs.com/greedyco/p/7182555.html
Copyright © 2011-2022 走看看