LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树
微信搜一搜:bigsai
大家都在關注的刷題、學習數據結構和算法寶藏項目
關注回復進群即可加入力扣打卡群,歡迎劃水。近期打卡:
LeetCode 92反轉鏈表Ⅱ&93復制ip地址&94二叉樹的中序遍歷
LeetCode 96不同的二叉搜索樹&95不同的二叉搜索樹Ⅱ
LeetCode 97交錯字符串(動態規劃)
驗證二叉搜索樹
給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特征:
- 節點的左子樹只包含小于當前節點的數。
- 節點的右子樹只包含大于當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入:2/ \1 3 輸出: true示例 2:
輸入:5/ \1 4/ \3 6 輸出: false 解釋: 輸入為: [5,1,4,null,null,3,6]。根節點的值為 5 ,但是其右子節點值為 4 。分析
二叉搜索樹的中序遍歷是一個遞增序列,所以我們只需要進行二叉樹的中序遍歷查詢序列是否一直有序即可。當然,如果你直接利用二叉搜索樹的定義左節點<根節點<右節點的話當然也沒問題。具體實現上,你可以先將中序序列求出來判斷是否有序,也可直接利用一個臨時存儲上一個節點的值進行判斷。
具體代碼為:
// public boolean isValidBST(TreeNode root) { // List<Integer>list=new ArrayList<Integer>(); // dfs(root,list); // if(list.size()<=1)return true; // for(int i=1;i<list.size();i++) // { // if(list.get(i)<=list.get(i-1)) // return false; // } // return true; // } // private void dfs(TreeNode root, List<Integer> list) { // // TODO Auto-generated method stub // if(root==null) // return; // dfs(root.left, list); // list.add(root.val); // dfs(root.right, list); // } long pre=Long.MIN_VALUE; public boolean isValidBST(TreeNode root) {if(root==null)return true;if(!isValidBST(root.left))return false;if(pre>=root.val)return false;pre=root.val;if(!isValidBST(root.right))return false;return true; }恢復二叉搜索樹
給你二叉搜索樹的根節點 root ,該樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。
進階:使用 O(n) 空間復雜度的解法很容易實現。你能想出一個只使用常數空間的解決方案嗎?
示例 1:
示例 2:
提示:
樹上節點的數目在范圍 [2, 1000] 內 -2^31 <= Node.val <= 2^31 - 1分析:
這題主要是需要動手畫一畫分析。首先它告訴本來一個二叉搜索樹有兩個節點的值被交換,我們知道對應一個正常的二叉搜索樹它的中序排序序列是有序遞增的,那么要將它們的數值進行交換。
分析一個序列1 3 5 7 8 9 10 假如其中的3和9進行交換次序(選擇模擬的時候要么選擇非常遠要么選擇非常更直觀)那么有兩段逆序,兩個分別可以確定大小點。如果兩個相鄰交換那么僅有一段逆序對,分別是交換的兩個節點。
當然在具體實現的時候你可以根據位置進行記錄,一旦到達第二個逆序就可以停止。這題中序遍歷上你可以直接先一次求中序序列,然后找到兩個逆序,第二次再去進行交換(O(n))。當然更好的方法是一次就去把這個過程搞完,需要借助一個前驅節點去比較前一個數(O(1))。
具體代碼為:
// public void recoverTree(TreeNode root) { // List<Integer>list=new ArrayList<Integer>(); // dfs1(root,list); // int l=-1,lvalue=0,r=-1,rvalue=0; // for(int i=1;i<list.size();i++) // { // if(list.get(i)<list.get(i-1)) // { // if(l==-1) { // l=i-1; // lvalue=list.get(i-1); // } // r=i; // rvalue=list.get(i); // } // } // dfs2(root,l,lvalue,r,rvalue); // } // int index=0; // private void dfs2(TreeNode root, int l, int lvalue, int r, int rvalue) { // if(root==null) // return; // dfs2(root.left, l, lvalue, r, rvalue); // if(index>r) // return; // if(index==l) // root.val=rvalue; // else if(index==r) // root.val=lvalue; // index++; // dfs2(root.right, l, lvalue, r, rvalue); // } // private void dfs1(TreeNode root, List<Integer> list) { // // TODO Auto-generated method stub // if(root==null) // return; // dfs1(root.left, list); // list.add(root.val); // dfs1(root.right, list); // // }public void recoverTree(TreeNode root) {Stack<TreeNode> q1 = new Stack(); TreeNode first=null;TreeNode second=null;TreeNode pre=new TreeNode(Integer.MIN_VALUE);TreeNode t=root;while(!q1.isEmpty()||t!=null){if (t!=null) {q1.push(t);t=t.left;}else {t=q1.pop();//中序操作if(t.val<pre.val){if(first==null)first=pre;else {second=t;break;//可以停止了}second=t;}pre=t;//更新下pret=t.right;}}int team=first.val;first.val=second.val;second.val=team;}原創不易,bigsai請你幫兩件事幫忙一下:
star支持一下, 您的肯定是我在平臺創作的源源動力。
微信搜索「bigsai」,關注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。
記得關注、咱們下次再見!
總結
以上是生活随笔為你收集整理的LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 97交错字符串(动态规
- 下一篇: LeetCode 100相同的树101对