改写二叉树PreOrder 算法,消去第二个递归调用PreOrder(t->rightChild);

pseudocodes 2008-04-17 04:54:43

void PreOrder(BinTreeNode *t) { 
if (t != NULL) { //递归结束条件
cout << t->data; //访问(输出)根结点
PreOrder(t->leftChild); //前序遍历左子树
PreOrder(t->rightChild); //前序遍历右子树
}
}

问题补充:就是消二叉树前序遍历的尾递归
...全文
232 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tailzhou 2008-06-03
  • 打赏
  • 举报
回复
将右子树加到左子树最后访问的节点下;

void PreOrder(BinTreeNode *t) {
if (t != NULL) { //递归结束条件
cout << t->data; //访问(输出)根结点


BinTreeNode *node1=t;
BinTreeNode *node2=node1->leftChild;
while (node2!=null)
{
node1=node2;
if (node1->rightChild!=null)
node2=node1->rightChild;
else
node2=node1->leftChild;
}
node1->leftChild=t->rightChild;
PreOrder(t->leftChild); //前序遍历左子树
node1->leftChild=null;
}
}
mLee79 2008-06-03
  • 打赏
  • 举报
回复

void PreOrder2(BTreeNode *t) {
while( NULL != t ) {
printf( "%d " , t->value );
PreOrder2( t->leftChild );
t = t->rightChild;
}
}

这样好像没啥意思, 还不如每个node加个parent节点, 就可以用非递归算法了 ...
Supercaller 2008-06-01
  • 打赏
  • 举报
回复
这是有可能的,我们构造根的左子树时,其中调用的构造右子树的函数用非递归方法,而构造树的根结点的右子树时也是用非递归方法完成,这样说明在整个构造树的过程中一般非递归函数的调用次数多于递归函数的调用次数
Supercaller 2008-05-25
  • 打赏
  • 举报
回复
个人认为如果这样有可能的话,除非你在消了尾递归后还能保证第一个递归的正常执行,或者说存在一个函数在遍历完左子树后能遍历右子树,同时遍历右子树时也能起到递归的作用
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
不会,帮顶
hyzhx 2008-04-19
  • 打赏
  • 举报
回复
是消除递归,还是消除第二个递归调用PreOrder(t->rightChild);
改成非递归算法?
xuxichun 2008-04-18
  • 打赏
  • 举报
回复
思考ing,楼上的意思是想仍然采用递归的结构,但是子递归只有一个?
pseudocodes 2008-04-18
  • 打赏
  • 举报
回复
没人明白吗?
pseudocodes 2008-04-18
  • 打赏
  • 举报
回复
对啊,就是这个意思,请各位大牛给个思路

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧