Java二叉樹排序及任意兩點個節點間的最大距離
網上看到的基本都是c或c++實現的,參照同樣的演算法寫了個java版的。
參考文章地址:http://blog.csdn.net/cxh342968816/article/details/6656473
傳一個無序陣列到buildTree()方法裡,會遞迴生成一個有序的二叉樹,在按照排序遞迴列印到控制檯。
countMaxDistance()方法是計算任意兩點個節點間的最大距離
/**
* @Description : 描述
* @author YangXuan
* @email 364105996@qq.com
* @date 2013-11-25 下午8:21:13
*/
public class Quest1 {
/**
* @Description : 節點實體
*/
private class Node {
Node left;
Node right;
int nValue;
int nMaxLeft;
int nMaxRight;
Node(int data) {
nValue = data;
}
}
private Node root;
private int maxDistance = 0;
public Quest1(Node root) {
this.root = root;
}
/**
* @Description: 將資料插入二叉樹並使之有序
* @return Node 返回型別
*/
private Node insert(Node node, int data) {
if (node == null) {
node = new Node(data);
} else {
if (data <= node.nValue) {
node.left = insert(node.left, data);
} else {
node.right = insert(node.right, data);
}
}
return node;
}
/**
* @Description: 將陣列轉換成二叉樹
* @return void 返回型別
*/
public void buildTree(int[] data) {
for (int i = 0; i < data.length; i++) {
root = insert(root, data[i]);
}
}
/**
* @Description: 列印有序二叉樹
* @return void 返回型別
*/
private void printTree(Node node) {
if (node == null)
return;
printTree(node.left);
System.out.print(node.nValue + " ");
printTree(node.right);
}
public void printTree() {
printTree(root);
}
private void maxDistance(Node root) {
// 遍歷到葉子節點,返回
if (root == null)
return;
// 如果左子樹為空,那麼該節點的左邊最長距離為0
if (root.left == null) {
root.nMaxLeft = 0;
}
// 如果右子樹為空,那麼該節點的右邊最長距離為0
if (root.right == null) {
root.nMaxRight = 0;
}
// 如果左子樹不為空,遞迴尋找左子樹最長距離
if (root.left != null) {
maxDistance(root.left);
}
// 如果右子樹不為空,遞迴尋找右子樹最長距離
if (root.right != null) {
maxDistance(root.right);
}
// 計算左子樹最長節點距離
if (root.left != null) {
int nTempMax = 0;
if (root.left.nMaxLeft > root.left.nMaxRight) {
nTempMax = root.left.nMaxLeft;
} else {
nTempMax = root.left.nMaxRight;
}
root.nMaxLeft = nTempMax + 1;
}
// 計算右子樹最長節點距離
if (root.right != null) {
int nTempMax = 0;
if (root.right.nMaxLeft > root.right.nMaxRight) {
nTempMax = root.right.nMaxLeft;
} else {
nTempMax = root.right.nMaxRight;
}
root.nMaxRight = nTempMax + 1;
}
// 更新最長距離
if (root.nMaxLeft + root.nMaxRight > maxDistance) {
maxDistance = root.nMaxLeft + root.nMaxRight;
}
}
public void countMaxDistance() {
maxDistance(root);
}
public static void main(String[] args) {
Node root = null;
Quest1 a = new Quest1(root);
int[] data = { 9, 6, 4, 8, 7, 3, 15, 13, 16, 18, 14, 15, 15, 16 };
a.buildTree(data);
a.countMaxDistance();
a.printTree();
System.out.println();
System.out.println("任意兩個節點間的最大距離為 : " + a.maxDistance);
}
}
順帶附一張草稿圖便於理解
相關文章
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 783. 二叉搜尋樹節點最小距離
- 計算地圖中兩點之間的距離地圖
- 2058. 找出臨界點之間的最小和最大距離
- C++語言演算法之求任意兩個相同字元的最大距離C++演算法字元
- 008,二叉樹的下一個節點二叉樹
- 實現一個函式,對給定平面任意兩點座標(x 1 ,y 1 )和(x 2 ,y 2 ),求這兩點之間的距離函式
- C語言:使用函式計算兩點間的距離C語言函式
- Java中在二叉搜尋樹中查詢節點的父節點Java
- 尤拉計劃547:帶洞正方形內任意點間距離
- 快速求完全二叉樹的節點個數二叉樹
- 根據經緯度計算兩點之間的距離的公式公式
- Day16 | 104.二叉樹的最大深度 、111.二叉樹的最小深度 、222.完全二叉樹的節點個數二叉樹
- 刷題系列 - 在給出二叉樹中兩個點,求出其最小共同父節點二叉樹
- JAVA計算兩經緯度間的距離Java
- LeetCode-222-完全二叉樹的節點個數LeetCode二叉樹
- 二叉樹:距離最近的共同祖先二叉樹
- 常見問題01:計算地球上兩個點的距離
- 點到直線的距離,垂足,對稱點,兩點所成的直線方程
- 程式碼隨想錄——二叉樹-11.完全二叉樹的節點個數二叉樹
- JZ-076-樹中兩個節點的最低公共祖先
- 為什麼二叉樹中葉子節點個數等於度為2的節點個數+1二叉樹
- 定義Point類,採用友元類的方式計算兩個點之間的水平和垂直距離
- 根據兩點經緯度計算距離和角度——java實現Java
- 程式碼隨想錄 第十六天 | ● 104.二叉樹的最大深度 559.n叉樹的最大深度 ● 111.二叉樹的最小深度 ● 222.完全二叉樹的節點個數二叉樹
- 原生JS獲取DOM 節點到瀏覽器頂部的距離或者左側的距離JS瀏覽器
- 刷題系列 - 在二叉樹中,為每個節點關聯其右相鄰節點二叉樹
- 微信小程式——計算2點之間的距離微信小程式
- TCP 中的兩個細節點TCP
- 二叉搜尋樹如何刪除節點
- 【vue】在二叉樹中根據子節點找出父節點路徑Vue二叉樹
- 3-點的座標及最遠距離問題
- 671. 二叉樹中第二小的節點二叉樹
- Laravel 距離排序Laravel排序
- 刷題系列 - 在二叉樹中查詢給出節點,並返回以該節點為根的樹二叉樹
- 程式碼隨想錄演算法訓練營day16 | leetcode 104. 二叉樹的最大深度、559. N 叉樹的最大深度、111. 二叉樹的最小深度、222. 完全二叉樹的節點個數演算法LeetCode二叉樹
- 到達二叉樹目標節點的完整路徑二叉樹
- LeetCode——671. 二叉樹中第二小的節點LeetCode二叉樹
- 程式碼隨想錄演算法訓練營第第16天 | 104.二叉樹的最大深度 、111.二叉樹的最小深度、222.完全二叉樹的節點個數演算法二叉樹