java 二叉树的深度、平衡二叉树、二叉树的下一个结点
1. 二叉樹的深度
1. 題目描述
輸入一棵二叉樹,求該樹的深度。從根結(jié)點到葉結(jié)點依次經(jīng)過的結(jié)點(含根、葉結(jié)點)形成樹的一條路徑,最長路徑的長度為樹的深度。
2. 求解思路
可以用后序遍歷,從最后一層往上累加層數(shù),最后加上根節(jié)點。
3. 代碼
class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}public class TreeDepth {public static void main(String[] args) {// 新建一棵二叉搜索樹TreeNode root=new TreeNode(10);TreeNode n1=new TreeNode(5);TreeNode n2=new TreeNode(12);TreeNode n3=new TreeNode(4);TreeNode n4=new TreeNode(7);TreeNode n5=new TreeNode(11);TreeNode n6=new TreeNode(16);TreeNode n7=new TreeNode(19);root.left=n1;root.right=n2;n1.left=n3;n1.right=n4;n2.left=n5;n2.right=n6;n6.right=n7;System.out.println("后序遍歷:");postOrderTraverse(root);int temp=TreeDep(root);System.out.println("\n"+"深度:"+temp);}public static int TreeDep(TreeNode pRoot){if(pRoot == null){return 0;}int left = TreeDep(pRoot.left);int right = TreeDep(pRoot.right);return Math.max(left, right) + 1;}// 后序遍歷public static void postOrderTraverse(TreeNode node) { if (node == null) return; postOrderTraverse(node.left); postOrderTraverse(node.right); System.out.print(node.val + " "); }}運行:
后序遍歷: 4 7 5 11 19 16 12 10 深度:42. 平衡二叉樹
1. 題目描述
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
2. 解題思路
仍然可以用后序遍歷樹深度,同時每次遍歷時都對比每一節(jié)點下的子節(jié)點分支的深度是不是符合平衡二叉樹的要求。
3. 代碼
class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}public class IsBalanced_Solution {public static void main(String[] args) { // 新建一棵二叉搜索樹TreeNode root=new TreeNode(10);TreeNode n1=new TreeNode(5);TreeNode n2=new TreeNode(12);TreeNode n3=new TreeNode(4);TreeNode n4=new TreeNode(7);TreeNode n5=new TreeNode(11);TreeNode n6=new TreeNode(16);TreeNode n7=new TreeNode(19);TreeNode n8=new TreeNode(20);root.left=n1;root.right=n2;n1.left=n3;n1.right=n4;n2.left=n5;n2.right=n6;n6.right=n7;n7.right=n8;System.out.println("后序遍歷:");postOrderTraverse(root); isBalanced(root);System.out.println("\n"+"結(jié)果:"+isBalance);}static boolean isBalance=true;public static int isBalanced(TreeNode pRoot){if(pRoot == null){return 0;}int left = isBalanced(pRoot.left);int right = isBalanced(pRoot.right);if(Math.abs(left-right)>1){isBalance=false;}return Math.max(left, right) + 1;}// 后序遍歷public static void postOrderTraverse(TreeNode node) { if (node == null) return; postOrderTraverse(node.left); postOrderTraverse(node.right); System.out.print(node.val + " "); }}運行:
后序遍歷: 4 7 5 11 20 19 16 12 10 結(jié)果:false3. 二叉樹的下一個結(jié)點
1. 題目描述
給定一個二叉樹和其中的一個結(jié)點,請找出中序遍歷順序的下一個結(jié)點并且返回。注意,樹中的結(jié)點不僅包含左右子結(jié)點,同時包含指向父結(jié)點的指針。
2. 解題思路
參考大神的思路如下:
首先知道中序遍歷的規(guī)則是:左根右,然后作圖
結(jié)合圖,我們可發(fā)現(xiàn)分成兩大類:1、有右子樹的,那么下個結(jié)點就是右子樹最左邊的點;(eg:D,B,E,A,C,G) 2、沒有右子樹的,也可以分成兩類,a)是父節(jié)點左孩子(eg:N,I,L) ,那么父節(jié)點就是下一個節(jié)點 ; b)是父節(jié)點的右孩子(eg:H,J,K,M)找他的父節(jié)點的父節(jié)點的父節(jié)點…直到當前結(jié)點是其父節(jié)點的左孩子位置。如果沒有eg:M,那么他就是尾節(jié)點。
3. 代碼
class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;TreeLinkNode(int val) {this.val = val;} }public class GetNext {public static void main(String[] args) {// 新建一棵二叉搜索樹TreeLinkNode root=new TreeLinkNode(10);TreeLinkNode n1=new TreeLinkNode(5);TreeLinkNode n2=new TreeLinkNode(12);TreeLinkNode n3=new TreeLinkNode(4);TreeLinkNode n4=new TreeLinkNode(7);TreeLinkNode n5=new TreeLinkNode(11);TreeLinkNode n6=new TreeLinkNode(16);TreeLinkNode n7=new TreeLinkNode(19);root.left=n1;n1.next=root; root.right=n2;n2.next=root;n1.left=n3;n3.next=n1;n1.right=n4;n4.next=n1;n2.left=n5;n5.next=n2;n2.right=n6;n6.next=n2;n6.right=n7;n7.next=n6;System.out.println("中序遍歷:");inOrderTraverse(root); System.out.print("\n"+"結(jié)果:");TreeLinkNode temp= getNxt(n5);System.out.print(n5.val+"->"+temp.val);}static TreeLinkNode getNxt(TreeLinkNode node){if(node==null) return null;if(node.right!=null){ //如果有右子樹,則找右子樹的最左節(jié)點node = node.right;while(node.left!=null) node = node.left;return node;}while(node.next!=null){ //沒右子樹,則找第一個當前節(jié)點是父節(jié)點左孩子的節(jié)點if(node.next.left==node) return node.next;node = node.next;}return null; //退到了根節(jié)點仍沒找到,則返回null}// 中序遍歷public static void inOrderTraverse(TreeLinkNode node) { if (node == null) return; inOrderTraverse(node.left); System.out.print(node.val + " "); inOrderTraverse(node.right); }}運行:
中序遍歷: 4 5 7 10 11 12 16 19 結(jié)果:11->12數(shù)據(jù)結(jié)構(gòu)方面的小白,僅做學(xué)習(xí)。。。
總結(jié)
以上是生活随笔為你收集整理的java 二叉树的深度、平衡二叉树、二叉树的下一个结点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对称的二叉树
- 下一篇: 图片问题?