算法| 最大二叉樹(shù)肮之、合并二叉樹(shù)、二叉搜索樹(shù)中的搜索卜录、驗(yàn)證二叉搜索樹(shù)

654. 最大二叉樹(shù)

題目連接:https://leetcode.cn/problems/maximum-binary-tree/
思路:使用前序構(gòu)建二叉樹(shù) 區(qū)間[left, right)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private TreeNode constructMaximumBinaryTree(int[] nums, int left, int right) {
        if (left >= right) return null;
        // if (right - left == 1) return new TreeNode(nums[left]);
        int maxIndex = left;
        for (int i = left + 1; i < right; i++) {
            if (nums[i] > nums[maxIndex]) {
                maxIndex = i;
            }
        }
        int val = nums[maxIndex];
        TreeNode treeNode = new TreeNode(val);
        treeNode.left = constructMaximumBinaryTree(nums, left, maxIndex);
        treeNode.right = constructMaximumBinaryTree(nums, maxIndex + 1, right);
        return treeNode;
    }
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if (nums == null || nums.length == 0) return null;
        return constructMaximumBinaryTree(nums, 0, nums.length);
    }
}

二戈擒、 617. 合并二叉樹(shù)

題目連接:https://leetcode.cn/problems/merge-two-binary-trees/
思路一:使用前序遍歷兩個(gè)二叉樹(shù),遇到root1 == null return root2;遇到root2 == null return root1;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null) return root2;
        if (root2 == null) return root1;
        root1.val += root2.val;
        root1.left = mergeTrees(root1.left, root2.left);
        root1.right = mergeTrees(root1.right, root2.right);
        return root1;
    }
}

思路二:使用一個(gè)stack, 依次存放root2 root1, root1.val += root2.val,最后返回root1

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null) return root2;
        if (root2 == null) return root1;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root2);
        stack.push(root1);
        while (!stack.isEmpty()){
            TreeNode treeNode1 = stack.pop();
            TreeNode treeNode2 = stack.pop();
            treeNode1.val += treeNode2.val;
            if (treeNode1.right != null && treeNode2.right != null) {
                stack.push(treeNode2.right);
                stack.push(treeNode1.right);
            } else {
                if (treeNode1.right == null) {
                    treeNode1.right = treeNode2.right;
                }
            }
            if (treeNode1.left != null && treeNode2.left != null) {
                stack.push(treeNode2.left);
                stack.push(treeNode1.left);
            } else {
                if (treeNode1.left == null) {
                    treeNode1.left = treeNode2.left;
                }
            }
        }

        return root1;
    }
}

三艰毒、 700. 二叉搜索樹(shù)中的搜索

題目連接:https://leetcode.cn/problems/search-in-a-binary-search-tree/
思路一:二叉搜索特性筐高,左子樹(shù)都比根節(jié)點(diǎn)小,右子數(shù)都比根節(jié)點(diǎn)大 使用遞歸法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) return null;
        if (root.val < val) {
            return searchBST(root.right, val);
        } else if (root.val > val) {
            return searchBST(root.left, val);
        } else {
            return root;
        }
    }
}

思路二:使用迭代法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        TreeNode cur = root;
        while (cur != null) {
            if (cur.val < val) {
                cur = cur.right;
            } else if (cur.val > val) {
                cur = cur.left;
            } else {
                return cur;
            }
        }
        return null;
    }
}

四丑瞧、 98. 驗(yàn)證二叉搜索樹(shù)

題目連接:https://leetcode.cn/problems/validate-binary-search-tree/
思路一:使用中序 記錄前一個(gè)節(jié)點(diǎn)凯傲,如果pre.val >= root.val 就返回false (使用遞歸中序方法)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private TreeNode pre = null;
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        boolean isLeft = isValidBST(root.left);
        if (!isLeft) return false;
        if (pre != null && pre.val >= root.val) return false;
        pre = root;
        return isValidBST(root.right);
    }
}

思路二:使用中序迭代法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        TreeNode cur = root;
        TreeNode pre = null;
        Stack<TreeNode> stack = new Stack<>();

        while (cur != null || !stack.isEmpty()) {
            if (cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                TreeNode treeNode = stack.pop();
                System.out.println(treeNode.val);
                if (pre != null && pre.val >= treeNode.val) return false;
                pre = treeNode;
                cur = treeNode.right;
            }
        }
        return true;
    }
}

思路三:使用后序遍歷

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private boolean isValidBST(TreeNode root, long min, long max) {
        if (root == null) return true;
        if (root.val <= min || root.val >= max) return false;
        boolean isLeft = isValidBST(root.left, min, root.val);
        if (!isLeft) return false;
        return isValidBST(root.right, root.val, max);
    }
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗦篱,隨后出現(xiàn)的幾起案子冰单,更是在濱河造成了極大的恐慌,老刑警劉巖灸促,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫欠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浴栽,警方通過(guò)查閱死者的電腦和手機(jī)荒叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)典鸡,“玉大人被廓,你說(shuō)我怎么就攤上這事÷茜瑁” “怎么了嫁乘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)球碉。 經(jīng)常有香客問(wèn)我蜓斧,道長(zhǎng),這世上最難降的妖魔是什么睁冬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任挎春,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘直奋。我一直安慰自己能庆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布脚线。 她就那樣靜靜地躺著搁胆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殉挽。 梳的紋絲不亂的頭發(fā)上丰涉,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天拓巧,我揣著相機(jī)與錄音斯碌,去河邊找鬼。 笑死肛度,一個(gè)胖子當(dāng)著我的面吹牛傻唾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播承耿,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冠骄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了加袋?” 一聲冷哼從身側(cè)響起凛辣,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎职烧,沒(méi)想到半個(gè)月后扁誓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚀之,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蝗敢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片足删。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寿谴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出失受,到底是詐尸還是另有隱情讶泰,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布拂到,位于F島的核電站峻厚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谆焊。R本人自食惡果不足惜惠桃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辜王,春花似錦劈狐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汹来,卻和暖如春续膳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收班。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工坟岔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摔桦。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓社付,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邻耕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸥咖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容