zoukankan      html  css  js  c++  java
  • 二叉树非递归遍历

    介绍二叉树的非递归算法(利用栈和父节点),实现相比较来说较为简单,代码更加简洁,逻辑清晰

    一、先序遍历

    <1>栈模拟实现

    void PreorderTraversal(BinaryTree T)
    {
        stack S;
    
        while (T != nullptr || !S.empty())
        {
            if (T != nullptr)
            {
                Visit(T);
                S.push(T);
                T = T->left;
            }
            else
            {
                T = S.pop();
                T = T->right;
            }
        }
    }

    <2>父节点实现

    void PreOrderTransval(BinaryTree T)
    {
        while (T != nullptr)
        {
            Visit(T);
            if (T->left != nullptr)
                T = T->left;
            else
            if (T->right != nullptr)
                T = T->right;
            else
            {
                BinaryTree child;
                while (1)
                {
                    child = T;
                    T = T->parent;
                    if (T == nullptr) break;
                    if (T->right != nullptr && T->left == child)
                    {
                        T = T->right;
                        break;
                    }
                }
            }
        }
    }

    二、中序遍历

    <1>栈模拟实现

    void InorderTraversal(BinaryTree T)
    {
        stack S;
        while (T != nullptr || !S.empty())
        {
            if (T != nullptr)
            {
                S.push(T);
                T = T->left;
            }
            else
            {
                T = S.pop( );
                Visit(T);
                T = T->right;
            }
        }
    }

    <2>父节点实现

    void InorderTraversal(BinaryTree T)
    {
        int mark = 0;
        while (T != nullptr)
        {
            if (mark == 0)
            {
                if (T->left != nullptr)
                    T = T->left;
                else
                    mark = 1;
            }
            else
            {
                BinaryTree child;
    
                Visit(T);
                if (T->right != nullptr)
                {
                    T = T->right;
                    mark = 1;
                }
                else
                {
                    while(1)
                    {
                        child = T;
                        T = T->parent;
                        if (T == nullptr) break;
                        if (T->left == child)
                        {
                            mark = 1;
                            break;
                        }
                    }
                }
            }
        }
    }

    三、后序遍历

    <1>栈模拟

    typedef struct
    {
        BinaryTree node = nullptr;
        int mark = 0;
    }Node;
    
    void PostOrder(BinaryTree bt)
    {
        stack<Node> s;
        Node tmpCell;
    
        while (bt || !s.empty())
        {
            if (bt)
            {
                tmpCell.node = bt;
                tmpCell.mark = 0;
                s.push(tmpCell);
                bt = bt->left;
            }
            else
            {
                tmpCell = s.top( );
                s.pop( );
                if (tmpCell.mark == 0)
                {
                    tmpCell.mark = 1;
                    s.push(tmpCell);
                    bt = bt->right;
                }
                else
                {
                    Visit(tmpCell.node);
                    bt = nullptr;
                }
            }
        }
    }
  • 相关阅读:
    ELK安装(ubuntu)
    Ubuntu18.04上安装java
    .net core跨平台的文件路径
    缺少vim
    docker进入容器
    docker删除名字为none的imgae
    Ubuntu18.04上安装Docker-Compose
    Java类的反射
    Java常用类(二) Scanner类和大数类
    Java常用类(一)Math类和Random类
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4096473.html
Copyright © 2011-2022 走看看