zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    中序遍历思想

    若二叉树为空,则结束遍历操作;否则
    中序遍历根节点的左子树;
    访问根节点;
    中序遍历右子树;

    实现代码:

    //中序遍历代码
    template<typename T>
    void BinaryTree<T>::InTraBiTree(BTNode<T> *p)
    {
        if(p)
        {
            InTraBiTree(p->lchild);
            cout<<p->data<<" ";
            InTraBiTree(p->rchild);
        }
    }

    下面是伪代码模拟计算机步骤帮助理解。

    假设有这样一个简单二叉树

    伪代码模拟计算机步骤如下:

     InTraBiTree(a)
    {
        if(a)
        {
            InTraBiTree(b)//a左为b,不为空
            {
                if(b)
                {
                    InTraBiTree(b左子)//b左子为空,直接执行下一步
                    {
                        if(NULL){};
                    }
                    cout<<b;
                    
                    InTraBiTree(c)//b右子为c
                    {
                        if(c)
                        {
                            InTraBiTree(c左子)//c左子为空,直接执行下一步
                            cout<<c;
                            InTraBiTree(c右子)//c右子为空,直接执行下一步
                        }
                    }//end c   c层执行结束,跳到b层
                }
            }//end b     b层结束跳到a层
            cout<<a;
            InTraBiTree(d)//a右为d
            {
                if(d)
                {
                    InTraBiTree(d左子)//d左子为空,直接执行下一步
                    cout<<d
                    InTraBiTree(d右子)//d右子为空,直接执行下一步
                }
            }
        }
    }

    下面是完全实现代码(C++版),可以测试下

    template<typename T>
    
    struct BTNode
    {
        T data;
        BTNode<T> *lchild;
        BTNode<T> *rchild;
    };
    template<typename T>
    class BinaryTree
    {
    private:
        BTNode<T> *BT;
    public:
        BinaryTree(){BT=NULL;}//构造函数,构造根节点并将根节点置空
            void CreateBiTree(T end);//创建结束标志位end的二叉树
            BTNode<T> * GetRoot();//返回根地址
            void InTraBiTree(BTNode<T> *p);//中序遍历二叉树
    };
    void BinaryTree<T>::CreateBiTree(T end)
    {
        cout<<"输入二叉树,以"<<end<<"为空指针域的标志:"<<endl;
        BTNode<T> *p;
        T x;
        cin>>x;
        if(x==end)
            return;
        p=new BTNode<T>;
        p->data=x;
        p->lchild=NULL;
        p->rchild=NULL;
        BT=p;
        create(p,1,end);
        create(p,2,end);
    }
    template<typename T>
    static int create(BTNode<T> *p,int k,int end)
    {
        BTNode<T> *q;
        T x;
        cin>>x;
        if(x!=end)
        {
            q=new BTNode<T>;
            q->data=x;
            q->lchild=NULL;
            q->rchild=NULL;
            if(k==1) p->lchild=q;
            if(k==2) p->rchild=q;
            create(q,1,end);
            create(q,2,end);
        }
        return 0;
    }
    template<typename T>
    BTNode<T> * BinaryTree<T>::GetRoot()
    {
        return BT;
    }
    template<typename T>
    void BinaryTree<T>::InTraBiTree(BTNode<T> *p)
    {
        if(p)
        {
            InTraBiTree(p->lchild);
            cout<<p->data<<" ";
            InTraBiTree(p->rchild);
        }
    }
    #include<iostream>
    using namespace std;
    #include"BinaryTree.h";
    
    int main(void)
    {
        
        BinaryTree<char> b;//构造二叉树对象,仅有一个b 指针指向NULL
        char end='#';
        b.CreateBiTree(end);//创建二叉树,以#为结束标志
        getchar();
    
        cout<<"中序遍历二叉树:";
        b.InTraBiTree(b.GetRoot());
        cout<<endl;
            
        getchar();
    }

  • 相关阅读:
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    python系统编程(一)
    python网络编程(十三)
    python网络编程(十二)
    python网络编程(十一)
  • 原文地址:https://www.cnblogs.com/qianwen/p/3807878.html
Copyright © 2011-2022 走看看