二叉树的遍历

中序遍历思想

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

实现代码:

//中序遍历代码
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();
}

 

posted @ 2014-06-25 13:23  北门吹风  阅读(220)  评论(0编辑  收藏  举报