【问题标题】:Finding the deepest level left leaf node in a binary search tree在二叉搜索树中找到最深层次的左叶节点
【发布时间】: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


【解决方案1】:

我认为您可以通过将当前级别和一个指示当前节点是左子节点还是右子节点的标志传递给每个调用来简化这一点...

类似这样的:

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);

假设根不为空。

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多