Finding the largest subtree in a BST

前端 未结 9 760
别那么骄傲
别那么骄傲 2020-12-28 11:02

Given a binary tree, I want to find out the largest subtree which is a BST in it.

Naive approach:

I have a naive approach in mind where I visit every node of

9条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-28 11:31

    To verify if a node is root of a BST , we have to recursively check each left and right children . If you start from root , you will have to recur all children before you can decide root of the binary tree is a BST or not . So it do not make any sense to call "isBST" for each node . Here's my approach

    1. Start from root
    2. Find max from left and right
    3. If not max on left and right return "NOT BST"
    4. if BST on left , check if it's bigger than the max so far . If yes store it and return "NOT BST"
    5. if BST on right, check if it's bigger than the max so far . If yes store it and return "NOT BST"
    6. If left and right are BST , there's a new BST with current root as ROOT and with number of nodes left + right + 1

    Couple of challenges in making this work is storing max so far for which i used a ref variable MaxNumNodes. maxbst withh have the root of the biggest BST found when the function return .

    public int MaxBST(Node root, int min, int max, ref Node maxbst, 
            ref int MaxNumNodes)
        {
            if (root == null) return 0;
    
            //Not a BST
            if (root.data < min || root.data > max) return -1;
    
            //Find Max BST on left
            int left = MaxBST(root.left, min, root.data, ref maxbst, 
                                        ref MaxNumNodes);
            //Find Max BST on right
            int right = MaxBST(root.right, root.data + 1, max, ref maxbst,
                                                ref MaxNumNodes);
    
            //Case1: -1 from both branches . No BST in both branches
            if (left == -1 && right == -1) return -1;
    
            //Case2:No BST in left branch , so choose right 
            //See if the BST on right is bigger than seen so far
            if (left == -1)
            {
                if (right> MaxNumNodes)
                {
                    MaxNumNodes = right;
                    maxbst = root.right;
                }
                return -1;
            }
    
            //Case3:No BST in right branch , so choose left 
            //See if the BST on left is bigger than seen so far
            if (right == -1)
            {
                if (left > MaxNumNodes)
                {
                    MaxNumNodes = left;
                    maxbst = root.left;
                }
                return -1;
            }
    
            //Case4:Both are BST , new max is left BST + right BST
            maxbst = root;
            return left + right + 1;
    
        }
    

提交回复
热议问题