在二进制搜索树中查找最深级别的左叶节点

Finding the deepest level left leaf node in a binary search tree

本文关键字:叶节点 二进制 搜索树 查找      更新时间:2023-10-16

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

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

类似这样的东西:

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

假定根不为null。