【发布时间】:2015-09-15 13:44:39
【问题描述】:
给定一棵二叉树,找出最深的叶子节点,它是其父节点的左子节点。例如,考虑下面的树。最深的左叶节点是值为 9 的节点。
1
/ \
2 3
/ / \
4 5 6
\ \
7 8
/ \
9 10
答案是 9。
我为此开发了以下代码:
int maxlevel = 0;
Node *newNode(int data)
{
Node *temp = new Node;
temp->val = data;
temp->left = temp->right = NULL;
return temp;
}
Node * root;
Node * maxi = NULL;
int getlevel (Node * treeroot,int level, Node * foo)
{
if (treeroot == NULL)
return -1;
else if (treeroot->val == foo->val)
return level+1;
else
{
int downlevel = getlevel(treeroot->left,level+1,foo);
if (downlevel != -1)
return downlevel;
else
downlevel = getlevel(treeroot->right,level+1,foo);
return downlevel;
}
}
void foo(Node * temp)
{
// Base case
if (temp == NULL)
return;
Node * prev;
if (temp->left != NULL)
{
prev = temp;
foo(temp->left);
}
if (prev->left != NULL)
{
if (temp->left == NULL && temp->right == NULL && prev->left == temp)
{
int ind = getlevel(root,0,temp);
if (ind > maxlevel)
{
maxlevel = ind;
maxi = temp;
}
}
}
foo(temp->right);
return;
}
这里,foo 是确定树中最深左叶的实际函数。 getlevel 是一个获取树中节点级别的函数。 newNode 是一个分配新节点的函数。
当我尝试给出这个输入树时,它说叶子不存在。我的逻辑有问题吗?
谢谢!
【问题讨论】:
-
仅供参考,如果/当
temp有一个空的left指针时,if (prev->left != NULL)将调用未定义的行为。无论如何,这都不好。
标签: c++ algorithm recursion tree