日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 二叉树的深度、平衡二叉树、二叉树的下一个结点

發(fā)布時間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 二叉树的深度、平衡二叉树、二叉树的下一个结点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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 深度:4

2. 平衡二叉樹

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é)果:false

3. 二叉樹的下一個結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。