您的位置:首页 > 编程语言 > C语言/C++

c++ 二叉树 的递归建立和递归遍历

2014-09-02 15:24 369 查看
最近应为要找工作准备把数据结构的基础的东西在不借助外力的情况下,自己都编写一遍,以为自己都知道的,结果一遍种小错误,简直要人命啊………………

本例最大的收获,*本质上是传值的,所以得用*&(指针的应用),不信你递归建立二叉树的时候用指针(不用指针引用)试试……

BiTree.cpp如下:

#include <iostream>
using namespace std;

template<typename T>
struct BiTreeNode
{
T data;
BiTreeNode *Lchild, *Rchild;
BiTreeNode() :Lchild(NULL), Rchild(NULL){}
BiTreeNode(const T& d, BiTreeNode *lchild = NULL, BiTreeNode *rchild = NULL) :data(d), Lchild(lchild), Rchild(rchild){}
};

template<typename T>
class BiTree
{
public:
BiTree(){ /*root = NULL;*/ }
~BiTree(){ /*makeEmpty();*/ }
void makeEmpty(BiTreeNode<T>* &root);
void createBiTree(BiTreeNode<T>* &root);
void output(BiTreeNode<T> *root);
void preOrder(BiTreeNode<T>* &root);
void inOrder(BiTreeNode<T>* &root);
void postOrder(BiTreeNode<T>* &root);
//BiTreeNode<T> * root;

};

template<typename T>
void BiTree<T>::createBiTree(BiTreeNode<T>* &root)
{
char ch;
cin >> ch;
if (ch == '#')
{
root = NULL;
}
else
{
root = new BiTreeNode<T>(ch);
createBiTree(root->Lchild);
createBiTree(root->Rchild);

}
}

template<typename T>
void BiTree<T>::output(BiTreeNode<T> *root)
{

if (root)
{
cout << root->data << "  ";
output(root->Lchild);
output(root->Rchild);
}
}

template<typename T>
void BiTree<T>::makeEmpty(BiTreeNode<T>* &root)
{

}

template<typename T>
void BiTree<T>::preOrder(BiTreeNode<T>* &root)
{
if (root)
{
cout << root->data << " ";
preOrder(root->Lchild);
preOrder(root->Rchild);
}

}

template<typename T>
void BiTree<T>::inOrder(BiTreeNode<T>* &root)
{
if (root)
{
preOrder(root->Lchild);
cout << root->data << " ";
preOrder(root->Rchild);
}

}

template<typename T>
void BiTree<T>::postOrder(BiTreeNode<T>* &root)
{
if (root)
{
postOrder(root->Lchild);
postOrder(root->Rchild);
cout << root->data << " ";
}
}

void main()
{
BiTreeNode<char> * R=NULL;
BiTree<char> * bt = new BiTree<char>();
bt->createBiTree(R);
cout << "输出结果是:" << endl;
bt->output(R);
cout << endl;
cout << "先根遍历:" << endl;
bt->preOrder(R);
cout << endl;
cout << "中根遍历:" << endl;
bt->inOrder(R);
cout << endl;
cout << "后根遍历:" << endl;
bt->postOrder(R);
cout << endl;
while (1)
{
}
}


结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: