int depth(TreeNode* root){ if(!root) return 0; int left = depth(root->left); int right = depth(root->right); hash[root]=max(left,right)+1; }这个求二叉树中某一个节点的高度的函数体中为什么要用左右子树高度的最大值?请举例说明
时间: 2024-03-28 11:41:19 浏览: 32
在这个函数中,计算节点高度的公式为左右子树高度的最大值加上1,这是因为一个节点的高度是由其子树中高度最大的一棵树决定的。如果一个节点的左右子树高度不同,那么它的高度就是更高的那个子树的高度加1。如果它的左右子树高度相同,那么它的高度就是左右子树高度加1。这样计算得到的高度就是该节点的真实高度。
举个例子,假设有以下二叉树:
```
1
/ \
2 3
/ \ / \
4 5 6 7
```
对于节点2,它的左子树高度为1,右子树高度为2,所以它的高度就是右子树高度2加1,即3。
对于节点1,它的左子树高度为2,右子树高度为2,所以它的高度就是左右子树高度的最大值2加1,即3。
对于节点5,它的左右子树高度都为0,所以它的高度就是0加1,即1。
相关问题
int depth(TreeNode *root) { if (!root) return 0; if (hs.find(root) != hs.end()) return hs[root]; int ldep = depth(root->left); int rdep = depth(root->right); return hs[root] = max(ldep, rdep) + 1; }
这是一个计算二叉树深度的函数,输入参数为指向二叉树根节点的指针 root,返回值为二叉树的深度。
函数使用了一个哈希表 hs 来存储已经计算过的节点的深度,避免了重复计算。如果当前的节点指针 root 为空,则返回深度 0。
如果哈希表中已经存在当前节点的深度,直接返回该节点的深度。
如果哈希表中不存在当前节点的深度,递归计算左右子树的深度 ldep 和 rdep,然后返回节点深度 hs[root],同时将计算结果存入哈希表中。
最终的节点深度为左右子树深度的最大值加 1。
int main() { TreeNode *root, *p, *pp; Initiate(&root); p = InsertLeftNode(root, 'A'); p = InsertLeftNode(p, 'B'); pp=p; p = InsertLeftNode(p, 'D'); p = InsertRightNode(pp, 'E'); p = InsertLeftNode(p, 'H'); p = InsertRightNode(root->leftChild, 'C'); pp = p; InsertLeftNode(p, 'F'); p = InsertRightNode(p, 'I'); InsertRightNode(pp, 'G'); PrintBiTree(root->leftChild, 1); return 0; }改变代码让I成为F的左子树
可以将原来的代码中的以下几行修改:
```
pp = p;
p = InsertRightNode(p, 'I');
InsertRightNode(pp, 'G');
```
改为:
```
pp = p->leftChild;
p->leftChild = InsertRightNode(p->leftChild, 'I');
InsertRightNode(pp, 'G');
```
这样就可以将I成为F的左子树了。完整代码如下:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *leftChild;
struct TreeNode *rightChild;
} TreeNode;
void Initiate(TreeNode **root) {
*root = (TreeNode*)malloc(sizeof(TreeNode));
(*root)->data = '\0';
(*root)->leftChild = NULL;
(*root)->rightChild = NULL;
}
TreeNode* InsertLeftNode(TreeNode *p, char x) {
TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = x;
newNode->leftChild = NULL;
newNode->rightChild = NULL;
p->leftChild = newNode;
return newNode;
}
TreeNode* InsertRightNode(TreeNode *p, char x) {
TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = x;
newNode->leftChild = NULL;
newNode->rightChild = NULL;
p->rightChild = newNode;
return newNode;
}
void PrintBiTree(TreeNode *p, int depth) {
if (p != NULL) {
PrintBiTree(p->rightChild, depth+1);
for (int i = 0; i < depth-1; i++) {
printf(" ");
}
if (depth > 0) {
printf("---");
}
printf("%c\n", p->data);
PrintBiTree(p->leftChild, depth+1);
}
}
int main() {
TreeNode *root, *p, *pp;
Initiate(&root);
p = InsertLeftNode(root, 'A');
p = InsertLeftNode(p, 'B');
pp = p->leftChild;
p = InsertLeftNode(p, 'D');
p = InsertRightNode(pp, 'E');
p = InsertLeftNode(p, 'H');
p =RightNode(root->leftChild, 'C');
pp = p->leftChild;
p->leftChild = InsertRightNode(p->leftChild, 'F');
p = InsertRightNode(p, 'I');
InsertRightNode(pp, 'G');
PrintBiTree(root->leftChild, 1);
return 0;
}
```
阅读全文