一些基于二叉树的操作
Some binary tree based operations
嗨,我正在尝试打印二叉搜索树中的非叶(内部(节点。但是我没有得到所需的输出.请纠正我的错误或建议我一些更好的算法。这是我的代码.
void noleaf(struct node *here)
{
if((temp -> left != NULL) || (temp -> right != NULL))
{
printf("%d" , temp -> data) ;
if(temp -> left != NULL)
{
noleaf(temp -> left) ;
}
}
noleaf(temp -> right) ;
return 0 ;
}
另一个函数要求我打印树的镜像。在这里我使用了.
struct node *Mirror(struct node *t)
{
if(t == NULL)
{
return 0 ;
}
else
{
nn = (struct node *)malloc(sizeof(struct node)) ;
nn -> data = t -> data ;
nn -> left = Mirror(t -> right);
nn -> right = Mirror(t -> left) ;
return nn ;
}
}
我是二叉树的新手.请帮忙。
你的逻辑看起来像这样:
- 如果节点至少有一个子节点,请打印其数据,然后
- 如果节点有一个左子节点,则递归到该节点
- 然后,递归到正确的子项,无论它是否存在。
我想你会同意,只打印至少有一个子节点的节点,并且对待一个子节点与另一个子节点不同,这是不公平的。
二叉树上的递归通常采用以下形式之一:
- 如果是叶子
,请进行叶子处理(所有情况都通用(
否则,要么
- 执行内部节点处理,然后递归到子树(预购(,或
- 递归到子树中,然后执行内部节点处理(后序(,或 递归到左侧子树,然后
- 执行内部节点处理,然后递归到右侧子树(按顺序(。
因此,noleaf
的预序遍历版本可能是
void noleaf(struct node *here)
{
if (here == NULL)
{
// Do nothing
}
else
{
printf("%d", here->data);
noleaf(here->left);
noleaf(here->right);
}
}
或者,简化
void noleaf(struct node *here)
{
if (here)
{
printf("%d", here->data);
noleaf(here->left);
noleaf(here->right);
}
}
打印树时真的有必要区分非叶节点吗?我已经重新排序了您的指令(并省略了返回值 - 您的编译器应该警告您(。
void printree(struct node *here)
{
if (here != NULL)
{
printree (here->left);
printf("%dn", here -> data) ;
printree (here->right);
}
}
对于 noleaf 函数,您必须检查此处是否不是 NULL(如果它是 NULL 这里>左或这里>右会导致分段错误或错误(,然后你必须检查这里是否有儿子,如果它至少有一个,那么我们不在叶子中,如果我们是,那么我们打印节点的内容。
void noleaf(struct node * here) {
if (here)
if (here->left || tree->right) {
printf("%dn",here->data);
noleaf(here->left);
noleaf(here->right);
}
}
注意:我不明白的一件事是你为什么使用temp而不是这里。
相关文章:
- 从父数组测试用例构造二叉树失败
- 打印时有二叉树问题.用户输入不打印任何内容
- 试图找到二叉树的深度
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 指向二叉树中新节点的指针
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 二叉树级别顺序遍历在leetcode中
- 运行无限循环的最小二叉树问题
- 打印二叉树中的常见元素
- 二叉树基准测试结果
- 带有矢量重复值的二叉树打印出来
- 签入二叉树的函数是平衡C++
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何计算给定数字在二叉树中出现的次数?
- 为什么我的二叉树会覆盖其根的叶子?
- 将二叉树的节点插入链表 (C++)
- 二叉树访谈:实现跟随操作
- 一些基于二叉树的操作
- 递归函数是如何对二叉树进行操作的