1. LeetCode - 98. Validate Binary Search Tree (判斷一顆二叉樹是否是一顆二叉搜索樹)spa
什麼是二叉搜索樹?任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值; 3d
根據性質怎麼判斷一顆二叉樹是否是搜索二叉樹呢? 其實很簡單,只要這顆二叉樹的中序遍歷的順序是升序的,那麼就是一顆二叉搜索樹,由於中序遍歷的順序是左->中->右,因此當中序遍歷升序的時候,就有左<中<右,因此就能夠判斷。code
class Solution { public boolean isValidBST(TreeNode root) { if(root == null) return true; Stack<TreeNode>stack = new Stack<>(); TreeNode cur = root; TreeNode pre = null; while(!stack.isEmpty() || cur != null){ if(cur != null){ stack.push(cur); cur = cur.left; }else { cur = stack.pop(); if(pre != null && cur.val <= pre.val) return false; pre = cur; cur = cur.right; } } return true; } }
2. 判斷一個二叉樹爲徹底二叉樹blog
判斷過程:遞歸
1.按照層次遍歷的順序遍歷二叉樹,每一層從左到右;get
2.若是當前結點有右孩子但沒有左孩子,直接返回false
;io
3.若是當前結點不是左右孩子都全(包括兩種狀況),那以後的結點必須都爲葉節點,不然返回false
;class
4.遍歷過程當中若是沒有返回false
,就返回true
;date
//判斷一棵二叉樹是否是徹底二叉樹 static boolean isCBT(TreeNode root){ if(root == null) return true; Queue<TreeNode>queue = new LinkedList<>(); boolean leaf = false; //若是碰到了 某個結點孩子不全就開始 判斷是否是葉子這個過程 queue.add(root); TreeNode top = null,L = null,R = null; while(!queue.isEmpty()){ top = queue.poll(); L = top.left; R = top.right; //第一種狀況 if((R != null && L == null)) return false; //第二種狀況 開啓了判斷葉子的過程 並且又不是葉子 就返回false if(leaf && (L != null || R != null)) //之後的結點必須是 左右孩子都是null return false; if(L != null) queue.add(L); //準確的說是 只要孩子不全就開啓leaf, //可是前面已經否認了有右無左的狀況,這裏只要判斷一下右孩子是否是爲空就能夠了(若是爲空就開啓leaf) if(R != null) queue.add(R); else leaf = true; } return true; }
3. 判斷一棵樹是否爲二叉平衡樹List
解決方法:從根節點開始,先判斷左右子樹的高度差是否超過1,而後接着判斷左右子樹是不是平衡二叉樹。這邊用到了遞歸思想。
public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if( root == null) { //一棵空樹就是平衡二叉樹 return true; } if( Math.abs(getDepth(root.left) - getDepth(root.right)) <= 1 ) { //知足左右子樹高度差小於等於1,那就接着判斷左右子樹是否是二叉樹 return (IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right)); } else { //不知足左右子樹高度差小於等於1,那這棵樹確定不是平衡二叉樹啦 return false; } } public int getDepth(TreeNode root) { if( root == null ) return 0; int left = getDepth(root.left); int right = getDepth(root.right); return ( left > right ? left : right ) + 1; } }