在CTCI中,他们给出了二叉树最小深度的公式,我很困惑。这是代码:
public static int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}
最小深度的定义是叶子节点,它是从根目录开始的最短路径吗?如果定义错误,请纠正我。
DILEMMA:我将root用15作为BST。然后继续向树中添加5,7,10,20,25,30,35。然后使用代码输出min为2。 如果我只是添加了10和25,那么min的输出也只是2.这假设是正确的吗?
我在这里将我的代码翻译成C ++,所以请告诉我,如果我在代码中犯了一个错误就搞砸了
int findMin(Node* root)
{
if (root == NULL)
return 0;
return 1 + std::min(findMin(root->left), findMin(root->right));
}
void addNum(Node*& root, int n)
{
if (root == NULL){
Node* temp = new Node(n);
root = temp;
return;
}
if (n > root->num){
addNum(root->right, n);
}
else{
addNum(root->left, n);
}
}
非常感谢!
答案 0 :(得分:0)
输入{15,10,20}
输入1:最初,将15
添加到BST中
15
输入2:现在,将10
添加到BST中
15
/
10
输入3:现在,将20
添加到BST中
15
/ \
10 20
因此, BST 的min
和max
高度为2
现在,考虑另一个输入案例{15,5,7,10,20,25,30,35}
输入1:最初,将15
添加到BST中
15
输入2:现在,将5
添加到BST中
15
/
5
输入3:现在,将7
添加到BST中
15
/
5
\
7
输入4:现在,将10
添加到BST中
15
/
5
\
7
\
10
输入5:现在,将20
添加到BST中
15
/ \
5 20
\
7
\
10
输入6:现在,将25
添加到BST中
15
/ \
5 20
\ \
7 25
\
10
输入7:现在,将30
添加到BST中
15
/ \
5 20
\ \
7 25
\ \
10 30
输入8:现在,将35
添加到BST中
15
/ \
5 20
\ \
7 25
\ \
10 30
\
35
正如您从上图所见, BST = min
&的4
身高 max
身高= 5
因此,如果正确查看findMin
代码,您会发现错误:
int findMin(Node* root)
{
if (root == NULL)
return 0;
return 1 + std::min(findMin(root->left), findMin(root->right));
}
错误:当您的root
指向5
时(即第二个示例中为15
的左子),它将返回1
给它的父母。 (为什么?)
更正:以下代码段将正常运行:
int min_depth(struct Node* root, int depth)
{
if (root->left == NULL && root->right == NULL)
return depth;
int x = (root->left != NULL) ? min_depth(root->left, depth+1) : depth;
int y = (root->right != NULL) ? min_depth(root->right, depth+1) : depth;
return (x < y) ? x : y;
}