这里就贴下过程了


package for_test;import java.util.Stack;//二叉树-不允许重复元素
public class BinaryTree {public static void main(String[] args) {Tree n = new Tree();n.insert(15);n.remove(15);System.out.println("1.----"+n.getRoot());n.insert(15);n.insert(1);n.insert(-10);n.insert(10);n.insert(20);n.insert(16);n.insert(22);n.insert(5);n.insert(-5);
//      n.insert(6);
//      n.insert(11);n.printTree(n.getRoot(), 0);System.out.println(n.getRoot());System.out.println(n.getRoot().parent);//Nord test = n.get(10);//System.out.println(test.parent);System.out.println("中序遍历(递归):");n.walkInOrder(n.getRoot());System.out.println("中序遍历(非递归):");n.walkInOrder2(n.getRoot());System.out.println("前序遍历(递归):");n.walkPreOrder(n.getRoot());System.out.println("前序遍历(非递归):");n.walkPreOrder2(n.getRoot());System.out.println("后序遍历(递归):");n.walkPostOrder(n.getRoot());System.out.println("后序遍历(非递归):");n.walkPostOrder2(n.getRoot());System.out.println("最大值:" + n.max(n.getRoot()));System.out.println("最小值:" + n.min(n.getRoot()));System.out.println("节点个数:"+n.size(n.getRoot()));System.out.println("树的深度:"+n.depth(n.getRoot()));n.remove(15);n.printTree(n.getRoot(), 0);System.out.println(n.getRoot());System.out.println(n.getRoot().parent);n.walkInOrder(n.getRoot());n.destroy(n.getRoot());System.out.println(n.size(n.getRoot()));}}class Tree {private Nord root;public Tree() {}public Tree(Nord root) {root = this.root;}public Nord getRoot() {return root;}public void setRoot(Nord root) {this.root = root;}// 找到根节点public Nord root(Nord x) {for (Nord p = x, r;;) {if ((r = p.parent) == null) {return p;}p = r;}}// 删除元素为x的节点public boolean remove(int x) {return remove(get(x));}/*** 参考算法导论-第12章* * 删除后的结构调整: 1.若x没有子节点,则简单删除x,修改父节点,使用null替换x 2.若x只有一个子节点z,则删除x,使用z替换x* 3.若x有两个子节点,则x的后继y(此时一定在x的右子树中,且y的左孩子节点为null)将替代x的位置。* 若y为x的右孩子,则将y.left=x.left;若y不是x的右孩子,则将y.parent.right=y.right,y.right=x.right;* * 具体算法: 1.若x.left=NULL,则transplant(x,x.right);* 2.否则,若x.right=null,则transplant(x,x.left); 3.* 若x.right!=null,x的后继y=min(x.right)[这里参考sucessor算法],若y.parent=x,则transplant(x,y),y.left=x.left,y.left.parent=y;* 若y.parent!=x,则先transplant(y,y.right),y.right=x.right,y.right.parent=y,再用y替代x的位置.* */public boolean remove(Nord x) {if (x != null) {Nord y;if (x.right == null) {transplant(x, x.left);} else if (x.left == null) {transplant(x, x.right);} else {if ((y = min(x.right)) != x.right) {transplant(y, y.right);y.right = x.right;y.right.parent = y;}transplant(x, y);y.left = x.left;y.left.parent = y;}return true;}return false;}// 将以y为根的子树替换以x为根的子树,此时x的父节点变为y的父节点,y为相应的孩子节点public boolean transplant(Nord x, Nord y) {if (x != null) {Nord p;if ((p = x.parent) == null) {if(y!=null) {this.root = y;y.parent=null;}else {this.root=null;}} else {if (x == p.left) {p.left = y;} else {p.right = y;}if (y != null) {y.parent = p;}}return true;}return false;}// 查找节点x的后继sucessor(大于x.element的最小节点)/*** 分两种情况: 若x的右子树非空,则返回min(x); 若x的右子树为空,则返回根节点;*/public Nord successor(Nord x) {if (x != null) {if (x.right != null) {return min(x.right);}Nord y = x.parent;while (y != null && y.right == x) {x = y;y = y.parent;// return this.root;}return y;}return null;}// 查找节点x的前驱predecessor(小于x.element的最大节点)public Nord predecessor(Nord x) {if (x != null) {if (x.left != null) {return max(x.left);}Nord y = x.parent;while (y != null && y.left == x) {x = y;y = y.parent;}return y;}return null;}// 查找最大值public Nord max(Nord root) {if (root != null) {while (root.right != null) {root = root.right;}return root;}return null;}// 查找最小值public Nord min(Nord root) {if (root != null) {while (root.left != null) {root = root.left;}return root;}return null;}// 中序遍历(递归)- 1.先访问其左子树 2.访问根节点3.访问其右子树public void walkInOrder(Nord root) {if (root != null) {walkInOrder(root.left);System.out.println(root.element);walkInOrder(root.right);}}// 中序遍历(非递归)public void walkInOrder2(Nord root) {Stack<Nord> s=new Stack<>();Nord p=root;while(s.size()>0 || p!=null) {while(p!=null) {s.push(p);p=p.left;}if(s.size()>0) {p=s.pop();System.out.println(p.element);p=p.right;} }       }// 前序遍历(递归)-1.先访问根节点 2.访问其左子树 3.访问其右子树public void walkPreOrder(Nord root) {if (root != null) {System.out.println(root.element);walkPreOrder(root.left);walkPreOrder(root.right);}}// 前序遍历(非递归)public void walkPreOrder2(Nord root) {Stack<Nord> s=new Stack<>();Nord p=root;while(s.size()>0 || p!=null) {while(p!=null) {System.out.println(p.element);s.push(p);p=p.left;}if(s.size()>0) {p=s.pop();p=p.right;}}}// 后序遍历(递归)- 1.先访问其左子树 2.访问其右子树 3.最后访问根节点public void walkPostOrder(Nord root) {if (root != null) {walkPostOrder(root.left);walkPostOrder(root.right);System.out.println(root.element);}}// 后序遍历(非递归) 参考:https://blog.csdn.net/wuwenxiang91322/article/details/12231657public void walkPostOrder2(Nord root) {Stack<Nord> s=new Stack<>();Nord p=root;while(p!=null) {for(;p.left!=null;p=p.left) {s.push(p);}while(p!=null &&(p.right==null || p.right==root)) {System.out.println(p.element);root=p;if(s.empty()) {return;}p=s.pop();}s.push(p);p=p.right;}}// 查找节点public Nord get(int x) {return get(root, x);}// 查找节点public Nord get(Nord root, int x) {if (root == null || x == root.element) {return root;}if (root.element > x) {return get(root.left, x);} else {return get(root.right, x);}}// insertpublic boolean insert(int item) {return insert(root, item);}// insert插入public boolean insert(Nord root, int item) {Nord nord = new Nord(null, null, null, item);int rt;Nord p = null;while (root != null) {p = root;if ((rt = root.element) > item) {root = root.left;} else if (rt < item) {root = root.right;} else {return false;}}if (p != null) {nord.parent = p;if (p.element < item) {p.right = nord;} else if (p.element > item) {p.left = nord;}} else {this.root = nord;}return true;}//删除整棵树public void destroy(Nord root) {if(root!=null) {destroy(root.left);destroy(root.right);remove(root);}    }//树的节点个数public int size(Nord root) {if(root==null) {return 0;}return 1+size(root.left)+size(root.right);}//树的深度public int depth(Nord root) {if(root==null) {return 0;}int l,r;return (l=depth(root.left))>(r=depth(root.right))?(1+l):(1+r);      }//凹入法打印(将树逆时针旋转90°后打印)public void printTree(Nord root,int n) {if(root!=null) {printTree(root.right,n+1);for(int i=0;i<n;i++) System.out.print("   ");System.out.print("-- ");System.out.print(root.element+"\n");printTree(root.left,n+1);}        }/*** 节点的结构采用链式存储:三叉链结构*/class Nord {Nord parent;Nord left;Nord right;int element;Nord(Nord parent, Nord left, Nord right, int element) {super();this.parent = parent;this.left = left;this.right = right;this.element = element;}@Overridepublic String toString() {return "Nord  [element=" + element + "]";}}}

结果:

1.----null-- 22-- 20-- 16
-- 15-- 10-- 5-- 1-- -5-- -10
Nord  [element=15]
null
中序遍历(递归):
-10
-5
1
5
10
15
16
20
22
中序遍历(非递归):
-10
-5
1
5
10
15
16
20
22
前序遍历(递归):
15
1
-10
-5
10
5
20
16
22
前序遍历(非递归):
15
1
-10
-5
10
5
20
16
22
后序遍历(递归):
-5
-10
5
10
1
16
22
20
15
后序遍历(非递归):
-5
-10
5
10
1
16
22
20
15
最大值:Nord  [element=22]
最小值:Nord  [element=-10]
节点个数:9
树的深度:4-- 22-- 20
-- 16-- 10-- 5-- 1-- -5-- -10
Nord  [element=16]
null
-10
-5
1
5
10
16
20
22
0

二叉搜索树的JAVA实现-201805相关推荐

  1. bst java_BST(二叉搜索树) Java 实现解析

    1.二叉搜索树的定义:一颗树的所有左子树都比根小,所有右子树都比根大,成为二叉搜索树. 2.该BST树实现了9个重要方法,分别是关键字查找,插入,删除,删除节点后续节点查找,前序遍历,中序遍历,后序遍 ...

  2. 《数据结构与算法之二叉搜索树(Java实现)》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  3. 二叉树和二叉搜索树的java实现

    二叉树的实现 原本的内容都放在二叉搜索树(BinarySearchTree)里面,今日重新看了一遍,强迫症让我把它分开了-以下~ package com.ssy.data_structure.tree ...

  4. 【LeetCode笔记】98. 验证二叉搜索树(Java、dfs、中序遍历、二叉树)

    文章目录 题目描述 代码 & 思路 题目描述 二叉搜索树,应该满足中序遍历的结果是按顺序的. 比如例1是1,2,3:而例二是1,5,3,4,6,是错的 代码 & 思路 就是中序遍历 + ...

  5. 【LeetCode笔记】96. 不同的二叉搜索树(Java、动态规划)

    文章目录 题目描述 代码 & 思路 精简版 2.0 题目描述 这道题其实不用构造数据结构 二叉搜索树:只要利用这个结构的性质即可,即:左右两子,左小右大 然后用动态规划来做,具体如何推导见思路 ...

  6. 二叉搜索树【Java数据结构】

    目录 搜索树 1.概念 2. 操作-查找 3. 操作-插入 4. 操作-删除 5. 代码实现 搜索树 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不 ...

  7. leetcode 1008. Construct Binary Search Tree from Preorder Traversal | 1008. 前序遍历构造二叉搜索树(Java)

    题目 https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/ 题解 好题. 我知道需要用 ...

  8. leetcode 108. Convert Sorted Array to Binary Search Tree | 108. 将有序数组转换为二叉搜索树(Java)

    题目 https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题解 经典二分,不解释了,直接看代码 /*** ...

  9. 《LeetCode力扣练习》第96题 不同的二叉搜索树 Java

    <LeetCode力扣练习>第96题 不同的二叉搜索树 Java 一.资源 题目: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回 ...

最新文章

  1. YUM部署高版本LNMP环境
  2. 分页存储管理和分段存储管理
  3. POJ 2456 Aggressive cows ( 二分 贪心 )
  4. 关于MySQL出现锁等待lock wait timeout exceeded; try restarting transaction 的解决方案
  5. ITK:多路输出不同的类型
  6. 设计一个简单的缓存容器
  7. 计算机原理 逻辑单元,湘潭大学计算机原理 实验一 算术逻辑单元ALU实验报告
  8. 【LeetCode笔记】剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(Java、二叉树、dfs)
  9. 数据科学和人工智能技术笔记 二、数据准备
  10. oracle out参数查询,Oracle的out参数实例详解
  11. 开源的 Snort 入侵检测系统中存在高危漏洞
  12. python调用C语言ctypes详解
  13. Android Audio子系统路由策略(三十六)
  14. STAR对RNA seq进行map
  15. DNS反劫持的几种方式
  16. python爬虫爬取糗百成人图片多线程版本
  17. maskrcnn训练问题报错:selected_polygons.append(self.polygons[i]) IndexError: list index out of range
  18. Mac PS CC2018详细软件按照教程
  19. idea中各种标记文件夹的含义
  20. 华为“废太子”李一男 出狱后能否东山再起?

热门文章

  1. 最值得收藏——免费ppt模板网站
  2. C++-生日-星座-性格查询
  3. 基于超算平台气象预警并行计算架构研究
  4. ICML 2022 | 基于有偏不对称对比学习的长尾分布外检测
  5. 揭秘:如何用主题公园的思路做一款VR高尔夫游戏
  6. Solidity:源文件结构
  7. Jexus for linux 安装说明
  8. 【Web前端开发】——HTML练习一:标记信件
  9. 计网:UDP TCP比较 +两者转换UDPtunnel工具
  10. C++ Primer(第四版)答案之第八章