关于二叉树的遍历
原始代码from: https://blog.csdn.net/Hu_weichen/article/details/80599994
自己写了下:
class BTNode
{
public:
BTNode(){}
~BTNode(){}
void frontTraverse(void);
void middleTraverse(void);
void rearTraverse(void);
friend void createNodeTree(BTNode** T);
private:
char data;
BTNode* mLeftChild;
BTNode* mRightChild;
};
void BTNode::frontTraverse(void)
{
cout << data;
if(mLeftChild)
{
mLeftChild->frontTraverse();
}
if(mRightChild != NULL)
{
mRightChild->frontTraverse();
}
}
void BTNode::middleTraverse(void)
{
if(mLeftChild)
{
mLeftChild->middleTraverse();
}
cout << data;
if(mRightChild)
{
mRightChild->middleTraverse();
}
}
void BTNode::rearTraverse(void)
{
if(mLeftChild)
{
mLeftChild->rearTraverse();
}
if(mRightChild)
{
mRightChild->rearTraverse();
}
cout << data;
}
void createNodeTree(BTNode** T)
{
char ch;
cin >> ch;
if('#' == ch)
{
*T= NULL;
}
else
{
(*T)->data = ch;
(*T)->mLeftChild = new BTNode;
createNodeTree(&((*T)->mLeftChild));
(*T)->mRightChild = new BTNode;
createNodeTree(&((*T)->mRightChild));
}
}
void main()
{
BTNode *T = new BTNode;
createNodeTree(&T);
if(T)
{
cout<<"前序:"<<endl;
T->frontTraverse();
cout<<"中序:"<<endl;
T->middleTraverse();
cout<<"后序:"<<endl;
T->rearTraverse();
system("pause");
}
}
有一点区别就是博客上写的是跑不过的,因为这个create函数:
void CreateBTree(BTNode * T)
{
char ch;
cin >>ch;
if ('#' == ch)
{
T=NULL;
}
else
{
T->data = ch;
T->pLchild = new BTNode;
CreateBTree(T->pLchild);
T->pRchild = new BTNode;
CreateBTree(T->pRchild);
}
}
当输入#时,想的是将它的子树指针置为空,但由于传的参数是指针,实际T = NULL是不能改变外部的指针的地址的,也就是这步实际是不生效的,子树仍是一个非空的指针。那么有两种方法,一种是传多重指针,因为指针传参时其内容是可以被修改的,如果把我们想要置空的指针变成指针的内容,就可以实现,实现如上。
另一种是传引用,方式如下:
typedef BTNode (*pBTNode); 首先定义一个类指针
friend void createNodeTree(pBTNode & T) 改为传指针的引用进去
具体实现:
void createNodeTree(pBTNode &T)
{
char ch;
cin >> ch;
if('#' == ch)
{
T= NULL;
}
else
{
T->data = ch;
T->mLeftChild = new BTNode;
createNodeTree(T->mLeftChild);
T->mRightChild = new BTNode;
createNodeTree(T->mRightChild);
}
}
运行没毛病。
这个例子对于递归,实际是出入栈,后进先出。对于指针传递与引用传递的理解是一个非常好的例子