给定二叉树,找到其父节点的子节点。例如,请考虑以下树。最左边的叶子节点是值为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
是一个分配新节点的函数。
当我尝试给出这个输入树时,它表示叶子不存在。我的逻辑有问题吗?
谢谢!
答案 0 :(得分:0)
我认为你可以通过传递当前级别和一个标志来简化这一点,该标志指示当前节点是每个呼叫中的左或右子节点......
这样的事情:
int maxLevel = 0;
Node* maxNode = null;
void findDeepestLeftNode(Node* node, int level, bool isLeftChild) {
bool isLeaf = true;
if (node->left != null) {
isLeaf = false;
findDeepestLeftNode(node->left, level + 1, true);
}
if (node->right != null) {
isLeaf = false;
findDeepestLeftNode(node->right, level + 1, false);
}
if (isLeaf && isLeftChild && level > maxLevel) {
maxLevel = level;
maxNode = node;
}
}
然后只需用:
调用它findDeepestLeftNode(root, 0, false);
假设root不为null。