1. 程式人生 > 其它 >力扣_樹

力扣_樹

二叉樹的最大深度

/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val; *this.left=left; *this.right=right; *} *} */ //深度優先遍歷 //方法可以參考一棵只有三個節點的樹(完全二叉樹) //classSolution{
//publicintmaxDepth(TreeNoderoot){ //if(root==null){ //return0; //}else{ //intleftmax=maxDepth(root.left); //intrightmax=maxDepth(root.right); ////返回到左右子樹的父節點,要求最高樹,因此要返回左右子樹高度的最大值並且高度要加1 //returnMath.max(leftmax,rightmax)+1; //} //} //}
//廣度優先遍歷 //按照層次遍歷,每遍歷一層高度加1 //遍歷的過程中要將每層的下一層的所有的節點存入在佇列中 classSolution{ publicintmaxDepth(TreeNoderoot){
//特殊情況 if(root==null){ return0; } //高度 inthigh=0; //設定佇列,佇列Queue的存入是offer,取出是poll Queue<TreeNode>queue=newLinkedList<TreeNode>(); //從根節點開始 queue.offer(root); //迴圈結束的條件是佇列為空 while(!queue.isEmpty()){ //每一層的節點個數 intsize=queue.size(); while(size>0){ TreeNodenode=queue.poll(); //先判斷node指標的左右節點是否為空再判斷是否是要存,不然會出現空指標異常
if(node.left!=null){ queue.offer(node.left); } if(node.right!=null){ queue.offer(node.right); } --size; } ++high; } returnhigh; } }

驗證二叉搜尋樹

/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val; *this.left=left; *this.right=right; *} *} */ //這題可以用中序遍歷先將樹的值都存下來,這裡建議用佇列 //然後判斷佇列是否後一項的值大於前一項的,如果中間存在不是後一項大於前一項,則不是二叉搜尋樹 //classSolution{ //publicbooleanisValidBST(TreeNoderoot){ //Queue<TreeNode>queue=null; //queue=isOrderTraversal(root); ////求佇列的長度 //intlength=queue.size(); ////判斷是否前一項的值小於後一項的值 //while(!queue.isEmpty()){ //TreeNodet1=queue.poll(); //intt11=t1.val; //TreeNodet2=queue.poll(); //intt22=t2.val; //if(t11>t22){ //returnfalse; //} //} //returntrue; //}
////中序遍歷 //publicQueue<TreeNode>isOrderTraversal(TreeNodenode){ ////設定佇列用於儲存中序遍歷過程中存下的值 //Queue<TreeNode>queue=newLinkedList<TreeNode>(); //if(node==null){ //returnnull; //}else{ //isOrderTraversal(node.left); //queue.offer(node); //isOrderTraversal(node.right); //} //returnqueue; //} //}
//不使用遞迴的中序遍歷 classSolution{ publicbooleanisValidBST(TreeNoderoot){ Deque<TreeNode>stack=newLinkedList<TreeNode>(); doublecur=-Double.MAX_VALUE; while(root!=null||!stack.isEmpty()){ while(root!=null){ stack.push(root); root=root.left; } root=stack.pop(); //必須帶等號 if(root.val<=cur){ returnfalse; } cur=root.val; root=root.right; } returntrue; } }

對稱二叉樹

/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val; *this.left=left; *this.right=right; *} *} */ //判斷該二叉樹是否為對稱二叉樹 //可以設定內層判斷和外層判斷 //從上往下判斷,當出現任意一次不對稱,則該二叉樹就不是對稱二叉樹 classSolution{ publicbooleanisSymmetric(TreeNoderoot){ returnCompare(root.left,root.right); }
//判斷是否為對稱二叉樹 publicbooleanCompare(TreeNodeleft,TreeNoderight){ if(left==null&&right!=null){ returnfalse; } if(left!=null&&right==null){ returnfalse; } if(left==null&&right==null){ returntrue; } if(left.val!=right.val){ returnfalse; } //判斷外層 booleanout=Compare(left.left,right.right); //判斷內層 booleanin=Compare(left.right,right.left); returnout&&in; } }

二叉樹的層序遍歷

/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val; *this.left=left; *this.right=right; *} *} */ //層次遍歷需要注意的是每次都要將儲存下來的串儲存下來,是個二維的串 classSolution{ publicList<List<Integer>>levelOrder(TreeNoderoot){ //設定二維的串用於儲存一維的串 List<List<Integer>>ll=newArrayList<List<Integer>>(); if(root==null){ returnll; } //設定佇列用於儲存一層的節點,佇列Queue要和LinkedList搭配使用 Queue<TreeNode>queue=newLinkedList<TreeNode>(); queue.offer(root); while(!queue.isEmpty()){ //求這一層的長度 intn=queue.size(); //設定一維的串用於儲存該層的元素值 List<Integer>l=newArrayList<Integer>(); while(n>0){ //先取出才能得到值 TreeNodenode=queue.poll(); l.add(node.val); if(node.left!=null){ queue.offer(node.left); } if(node.right!=null){ queue.offer(node.right); } n--; } //將一維的串存入在二維的串中 ll.add(l); } returnll; } }

將有序陣列轉換為二叉搜尋樹

/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val; *this.left=left; *this.right=right; *} *} */ //從上往下存入,每次將有序陣列的中間節點當做父節點 //父節點的左孩子為左半子樹的中間節點 //父節點的右孩子為右半子樹的中間節點 classSolution{ publicTreeNodesortedArrayToBST(int[]nums){ returndfs(nums,0,nums.length-1); }
publicTreeNodedfs(int[]nums,intl,intr){ if(l>r){ returnnull; } //中間節點的值存入在樹中 intmid=(l+r)/2; TreeNoderoot=newTreeNode(nums[mid]); //存入中間節點的左子樹節點和右子樹節點 root.left=dfs(nums,l,mid-1); root.right=dfs(nums,mid+1,r); returnroot; } }