你是否已经厌倦了,那只能找到孩子却不能反向寻找双亲结点,那遍历起来想要砸键盘的、陈旧的二叉树?今天,就是我们站起来了的时候了。(雾)
好了不皮了,先看一下定义
三叉树
这个名字不是指度最大为三的树,而是在二叉树(两个指针)的基础上多了个指针,因为二叉树找双亲结点只能用栈存储然后回溯,或者只能一个个结点的寻找,非常麻烦的。
(别问名字为什么这样,问就是学校ppt教的,不过也很形象)
好处:
首先就是找到从根节点到任意节点的路径方便了很多;
另外是在非递归遍历的时候,之前的二叉树结构想要回溯就只能借助栈,而现在不一样了,随时随地都能回溯。
typedef struct Btree//树的结构体
{
char data;
struct Btree* lchild;
struct Btree* rchild;
struct Btree* parent;
}btree;
结构体没什么好说的,只需要在之前的setup函数中对两个孩子调用的时候
那遍历起来什么样子呢?(中序为例)
void InOrder(btree* bt)
{
btree* p=bt, *pr=NULL;
while(p)
{
if(p->lchild)//走到最左
p=p->lchild;
else
{
cout<<p->data<< " ";
if(p->rchild)//有右子树直接走了
p=p->rchild;
else //没有就要回溯
{
pr=p;
p=p->parent;
while (p && (p->lchild != pr || !p->rchild))//找到有右子树的结点
{
if(p