问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java(算法与数据结构)tree

发布网友 发布时间:2022-04-23 14:48

我来回答

1个回答

热心网友 时间:2023-09-04 04:37

代码实现[一]部分
package ChapterEight;

class Tree {
class Node {
public long value;

public Node leftChild;

public Node rightChild;

public Node(long value) {
this.value = value;
leftChild = null;
rightChild = null;
}
}

public Node root;

public Tree() {
root = null;
}

// 向树中插入一个节点
public void insert(long value) {
Node newNode = new Node(value);
// 树是空的
if (root == null)
root = newNode;
else {
Node current = root;
Node parentNode;
while (true) {
parentNode = current;
if (value < current.value) {
current = current.leftChild;
// 要插入的节点为左孩子节点
if (current == null) {
parentNode.leftChild = newNode;
return;
}
} else {
// 要插入的节点为右孩子节点
current = current.rightChild;
if (current == null) {
parentNode.rightChild = newNode;
return;
}
}
}
}
}

// 先续遍历树中的所有节点
public void preOrder(Node currentRoot) {
if (currentRoot != null) {
System.out.print(currentRoot.value + " ");
preOrder(currentRoot.leftChild);
preOrder(currentRoot.rightChild);
}
}

// 中续遍历树中的所有节点
public void inOrder(Node currentNode) {
if (currentNode != null) {
inOrder(currentNode.leftChild);
System.out.print(currentNode.value + " ");
inOrder(currentNode.rightChild);
}
}

// 后续遍历树中的所有节点
public void postOrder(Node currentNode) {
if (currentNode != null) {
postOrder(currentNode.leftChild);
postOrder(currentNode.rightChild);
System.out.print(currentNode.value + " ");
}
}

public void traverse(int traverseType) {
switch (traverseType) {
case 1:
preOrder(root);
break;
case 2:
inOrder(root);
break;
case 3:
postOrder(root);
break;
default:
break;
}
// 依据树节点的值删除树中的一个节点
public boolean delete(int value) {
// 遍历树过程中的当前节点
Node current = root;
// 要删除节点的父节点
Node parent = root;
// 记录树的节点为左孩子节点或右孩子节点
boolean isLeftChild = true;
while (current.value != value) {
parent = current;
// 要删除的节点在当前节点的左子树里
if (value < current.value) {
isLeftChild = true;
current = current.leftChild;
}
// 要删除的节点在当前节点的右子树里
else {
isLeftChild = false;
current = current.rightChild;
}
// 在树中没有找到要删除的节点
if (current == null)
return false;
}
// 要删除的节点为叶子节点
if (current.leftChild == null && current.rightChild == null) {
// 要删除的节点为根节点
if (current == root)
root = null;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = null;
// 要删除的节点为右孩子节点
else
parent.rightChild = null;
}
// 要删除的节点有左孩子节点,没有右孩子节点
else if (current.rightChild == null) {
// 要删除的节点为根节点
if (current == null)
root = current.leftChild;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = current.leftChild;
// 要删除的节点为右孩子节点
else
parent.rightChild = current.leftChild;
}
// 要删除的节点没有左孩子节点,有右孩子节点
else if (current.leftChild == null) {
// 要删除的节点为根节点
if (current == root)
root = root.rightChild;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = current.rightChild;
// 要删除的节点为右孩子节点
else
parent.rightChild = current.rightChild;
}
// 要删除的接节点既有左孩子节点又有右孩子节点
else {
Node successor = getSuccessor(current);
// 要删除的节点为根节点
if (current == root)
root = successor;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = successor;
// 要删除的节点为右孩子节点
else
parent.rightChild = successor;
}
return true;
}

// 找到要删除节点的替补节点
private Node getSuccessor(Node delNode) {
// 替补节点的父节点
Node successorParent = delNode;
// 删除节点的替补节点
Node successor = delNode;
Node current = delNode.rightChild;
while (current != null) {
// successorParent指向当前节点的上一个节点
successorParent = successor;
// successor变为当前节点
successor = current;
current = current.leftChild;
}
// 替补节点的右孩子节点不为空
if (successor != delNode.rightChild) {
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}
}

public class TreeApp {
public static void main(String[] args) {
Tree tree = new Tree();
tree.insert(8);
tree.insert(50);
tree.insert(45);
tree.insert(21);
tree.insert(32);
tree.insert(18);
tree.insert(37);
tree.insert(64);
tree.insert(88);
tree.insert(5);
tree.insert(4);
tree.insert(7);

System.out.print("PreOrder : ");
tree.traverse(1);
System.out.println();

System.out.print("InOrder : ");
tree.traverse(2);
System.out.println();

System.out.print("PostOrder : ");
tree.traverse(3);
System.out.println();

System.out.println(tree.delete(7));

System.out.print("PreOrder : ");
tree.traverse(1);
System.out.println();

System.out.print("InOrder : ");
tree.traverse(2);
System.out.println();

System.out.print("PostOrder : ");
tree.traverse(3);
System.out.println();

}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
可以提前退出“三支一扶”计划吗 能提前退出“三支一扶”计划吗 绒沙金礼品制作工艺 什么叫绒沙金 榖皮巾的意思是什么 IPOD新版本安装会不会影响内存 我的是ipod 4 8G的,我下载了东西以后发现内存是占了,但是显示不出来东西... 为什么我的IPOD下载程序只用了4G却显示用了6.4G 间谍过家家阿尼亚表情包汇总(间谍过家家阿尼亚次子) 关于"化物语"中的女主 战场原黑仪(戦场ヶ原ひたぎ)的1440*900宽屏壁纸... 算法与数据结构对于Java程序员意味着什么? 数据结构与JAVA的关系? java(树的内容)算法与数据结构 Java 与 算法+数据结构 (100分) 山不向我走来我向山走去什么意思 在阿拉伯地区有很多人叫默罕默德,如果骂了那个叫默罕默德的普通人(不是指那个古代圣人) 默罕默德阿里的战绩 *教的先知默罕默德怎么知道那么多?事无巨细从生活到宗教,这些都是他自己想出来的吗? 先知默罕默德名言求解 耶和华,默罕默德,释迦摩尼到底是不是一个人 默罕默德是姓还是名? 默罕默德是不是地球第一大姓? 孔子墨子庄子老子释迦摩尼默罕默德都是哪个时代的? 大字不识的默罕默德,为何能够创立伊斯兰教? 现在叫默罕默德是不是一定是伊斯兰教的? 默罕默德信仰什么 山不到默罕默德那边去,默罕默德就到山的这边来出自哪里 在同一部手机上怎么注册另一个? 默罕默德是什么教 怎么用一个手机号码注册两个 问一下,WORD中页眉下面的横线怎么弄。还有装订线怎么弄 谁会java数据结构与算法啊? 询问java学习者对于算法和数据结构要求高不高? Java算法与数据结构代码 盒子支付——钱盒mpos600已经解绑了、怎么再添加慧POS,钱盒商户通里面 如何查公积金贷款还剩多少 住房公积金贷款怎么查剩余贷款 如何查询住房公积金贷款是否还完 住房贷款自己可以去办吗?还是非要房产公司给贷?具体要怎么操做 快手看视频的时候怎么是竖屏啊,怎么横屏啊,求用过快手的人来说说,谢... 快手怎么改变观看模式? 快手视频里面带旋转按钮的怎么弄? 为什么从手机发到快手上的视频是横过来的 桌椅脚套怎么做 自制桌子腿的做法 快手账号怎么查询垂直度 凳子腿松动但还能使用,自己在家如何手动修理可以完好如初? 凳子腿磨地板,用什么给凳子腿包住呢? 木椅子脚套保护套买布的好还是塑料的好? 手工做椅子腿时,如果长度差0.7cM左右,刨子不太好弄,请问用那些个方法比较好呢?