目录
代码
算法思想
例子
思维拓展
代码
int LeaveBit(Bitree T,int flag,int g) {
if (!T) {
return 0;
}
if (T->rchild == NULL && T->lchild == NULL) {
//cout << "empty:" << T->data << endl;
s.push(T->data);
while (!s.empty()) {
cout << s.top();
s.pop();
}
//cout << flag;
cout << endl;
if (flag ==-1) {
p.pop();
}
s = p;
return 1;
}
else {
if (g == 0) {
p.push(T->data);
}
s.push(T->data);
//cout << "push:" << T->data << endl;
return LeaveBit(T->lchild,1,0) + LeaveBit(T->rchild,-1,0);
}
}
算法思想
1)这里说明一下s和q是栈,s这个栈主要是存储根到叶子的路径,而p这个栈则存储的是左孩子或右孩子不为空的结点
2)flag是表示是否要删除p栈中的栈顶的值
由代码可知,向左后右。所以右边部分开始递归时,也就代表着一个结点(左孩子、右孩子不为空)已经完成了,可以开始p栈中下一个结点。
3)g表示p栈是否可以存储了除了根节点以外的结点
/*语言表达不好,请见谅*/
例子
思维拓展
开始我的思路:想将栈拿到递归里面去,但为什么要放弃呢?因为我发现栈的遍历输出相对麻烦。后面我想了两个解决办法,一个是指针,还有就是迭代器,因为我用的是stl这个库,如何弄指针不清楚(书到用时方恨少!!!!),而迭代器这个就有点好笑了,后面问了ai才知道stack并不提供迭代器。
当然不一定要用栈,可以用数组的方式,然后将数组代入递归,flag这个就不需要了,你们也可以试着写一下,大概的思路和我这个差不多(提前是要理解)。