Recursion 递归求树高的逻辑

Recursion 递归求树高的逻辑,recursion,logic,binary-search-tree,Recursion,Logic,Binary Search Tree,我正在努力寻找一棵树的高度。这是我在网上找到的一些代码。然而,我不明白它是如何工作的。如果您能解释一下这个程序是如何工作的,我将不胜感激 #包括 #包括 结构{ int数据; 结构n*左; 结构n*对; }; typedef结构n节点; 树的整数高度(节点*根){ if(root==NULL)返回-1;//为什么函数在这里不中断? int leftTree=树的高度(根->左); int rightree=树的高度(根->右); 如果(leftTree>rightTree)返回leftTree+

我正在努力寻找一棵树的高度。这是我在网上找到的一些代码。然而,我不明白它是如何工作的。如果您能解释一下这个程序是如何工作的,我将不胜感激

#包括
#包括
结构{
int数据;
结构n*左;
结构n*对;
};
typedef结构n节点;
树的整数高度(节点*根){
if(root==NULL)返回-1;//为什么函数在这里不中断?
int leftTree=树的高度(根->左);
int rightree=树的高度(根->右);
如果(leftTree>rightTree)返回leftTree+1;
否则返回rightTree+1;
}
节点*getNewNode(int数据){
node*newNode=(node*)malloc(sizeof(node));
新建节点->数据=数据;
newNode->left=NULL;
newNode->right=NULL;
返回newNode;
}
节点*插入(节点*根,整数数据){
如果(root==NULL)root=getNewNode(数据);
else if(数据)
根->左=插入(根->左,数据);
else root->right=插入(root->right,数据);
返回根;
}
int main(){
node*root=NULL;
根=插入(根,12);
根=插入(根,23);
根=插入(根,122);
根=插入(根,1);
根=插入(根,2);
根=插入(根,-3);
根=插入(根,-4);
printf(“%d\n”,根->右->数据);
printf(“%d\n”,树(根)的高度);
}

为什么树的
height\u函数不返回?

首先,要明确的是,您的程序是查找的高度,其中每个节点最多有两个子节点(左和/或右)

因此递归函数
height\u of_tree(node*root)
的基本思想是,从树的根开始,我们将找到并比较其左节点和右节点的
height

为了求左节点(或右节点)的高度,我们假设左节点及其所有子节点将作为一个子树独立存在,并且节点本身是根。我们开始在这样的子树上再次运行
height\u of_tree
,左节点作为新根(这就是为什么我们称之为递归)。同样的逻辑也适用于右节点:

// Reuse height_of_tree() to find the heights of the left node and the right node
// leftTree here means left tree's height
int leftTree  = height_of_tree(root->left); 
int rightTree = height_of_tree(root->right);
然后我们开始比较:如果左节点的高度>右节点的高度,则根节点(或其父节点)的左节点高度将为+1。反之亦然,如果右节点的高度>左节点的高度,则根节点的右节点高度将为+1:

if (leftTree > rightTree) return leftTree + 1;
else return rightTree + 1;
最后,条件检查
if(root==NULL)返回-1
检查何时停止向下搜索子树(因为它下面没有更多的节点,或者我们可以说node==NULL)。在执行其他代码行之前,我们必须首先检查这一点,因为
如果(root==NULL)
,那么我们肯定没有下一个左/右子级

一些示例:

1) 当树按字面意思=NULL时,树的高度将返回-1

node *root = NULL;
printf("%d\n", height_of_tree(root)); // Print out -1
2) 当树只有一个节点,即根节点时,树的高度将返回0。(请注意,根据定义,仅由根节点组成的树的高度为0)

3) 当树只有两个节点(即根节点和一个子节点)时,树的高度将返回1

node *root = NULL;
root = insert(root, 12); // root with value = 12
root = insert(root, 23); // right child because its value 23 > root's value 12 
printf("%d\n", height_of_tree(root)); // Print out 1
我将更详细地阐述第三种情况:

  • 首先,我们将从树根开始,它是12
  • 由于根不为NULL,我们开始查找其左子级的高度:
    int leftTree=height\u of_tree(root->left)
  • 由于左边的子级为NULL,执行函数
    height\u of_tree(root->left)
    时将返回-1,从而使
    int leftTree=-1
  • 然后,我们开始查找其右子级的高度:
    intrightree=height\u of_tree(root->right)
  • 右节点现在变成一个只有一个节点的新树,根据上面的例子#2,我们只有一个节点的树的高度为0,因此
    int rightree=0
  • 最后,比较leftTree和rightTree,我们发现rightTree更高,因此根的高度将是rightTree+1(其最高子树的高度+1)。因此,根的高度为=
    rightTree+1=1

希望这有帮助

我编辑了你的答案以使它更好。然而,我不能理解你问的很多问题。如果我的编辑以您不希望的方式更改了您的原始问题,请告诉我。原始问题没有更改,谢谢编辑。你能解释一下这个程序是如何工作的吗?如果你评论一下程序的哪些部分你不懂,那会更有帮助!名为树的高度的函数。我不明白它是如何工作的,所以你理解insert()函数和getNewNode()对吗?非常感谢,它非常有用,而且非常详细。你是最棒的!
node *root = NULL;
root = insert(root, 12); // root with value = 12
root = insert(root, 23); // right child because its value 23 > root's value 12 
printf("%d\n", height_of_tree(root)); // Print out 1