在二叉搜索树中找到最深层左叶节点

时间:2015-06-29 07:16:48

标签: c++ algorithm recursion tree

给定二叉树,找到其父节点的子节点。例如,请考虑以下树。最左边的叶子节点是值为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是一个分配新节点的函数。 当我尝试给出这个输入树时,它表示叶子不存在。我的逻辑有问题吗? 谢谢!

1 个答案:

答案 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。