package ch11;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack; public class LinkBinTree <T>{ public static class TreeNode
{
Object data;
TreeNode left;
TreeNode right;
public TreeNode()
{ }
public TreeNode(Object data)
{
this.data = data;
left = null;
right = null;
}
public TreeNode(Object data,TreeNode left,TreeNode right)
{
this.data = data;
this.left = left;
this.right = right;
}
}
private TreeNode root;
public LinkBinTree()
{
this.root = new TreeNode();
}
//以指定根元素创建二叉树
public LinkBinTree(T data)
{
this.root = new TreeNode(data);
}
//为指定节点添加子节点
public TreeNode addNode(TreeNode parent, T data,boolean isLeft)
{
if(parent == null)
throw new RuntimeException("节点为null,无法添加子节点");
if(isLeft && parent.left != null)
throw new RuntimeException(parent+"节点已经有左子节点,无法添加左子节点");
if(!isLeft && parent.right!=null)
throw new RuntimeException(parent+"节点已经有右子节点,无法添加右子节点");
TreeNode newNode = new TreeNode(data);
if(isLeft)
parent.left = newNode;
else
parent.right = newNode;
return newNode;
}
//判空
public boolean empty()
{
return root.data ==null;
}
//返回固定节点的左子节点
public T leftChild(TreeNode parent)
{
if(parent ==null)
throw new RuntimeException("节点为Null,没有子节点");
return parent.left == null?null:(T)parent.left.data;
}
public T rightChild(TreeNode parent)
{
if(parent ==null)
throw new RuntimeException("节点为Null,没有子节点");
return parent.right == null?null:(T)parent.right.data;
} public TreeNode root()
{
if(empty())
throw new RuntimeException("树为空,无法访问根节点");
return root;
}
public T parent(TreeNode node)
{
return null;
}
//递归,每棵子树的额深度为其所有子树的最大深度+1
public int deep(TreeNode node)
{
if(node == null)
return 0;
else{
int leftDeep = deep(node.left);
int rightDeep = deep(node.right);
int max = leftDeep>rightDeep?leftDeep:rightDeep;
return max+1;
}
} //先序遍历二叉树
public List<TreeNode> preIterator()
{
return preIterator(root);
}
public List<TreeNode> preIterator(TreeNode node)
{
List<TreeNode> list = new ArrayList<TreeNode>();
//处理根节点
list.add(node);
if(node.left!=null)
list.addAll(preIterator(node.left));
if(node.right!=null)
list.addAll(preIterator(node.right));
return list;
} //中序遍历
public List<TreeNode> inIteratror()
{
return inIterator(root);
}
private List<TreeNode> inIterator(TreeNode node)
{
List<TreeNode> list = new ArrayList<TreeNode>();
if(node.left!= null)
list.addAll(inIterator(node.left));
list.add(node);
if(node.right!=null)
list.addAll(inIterator(node.right));
return list;
}
//非递归先序遍历二叉树
public List<TreeNode> nonCursivePreIterator(TreeNode node){
Stack<TreeNode>stack = new Stack<TreeNode> ();
List<TreeNode> list = new ArrayList<TreeNode>();
list.add(node);
while(node!=null || !stack.empty())
{
while(node!=null)
{
//System.out.println(node.data);
list.add(node);
stack.push(node);
node=node.left;
}
if(!stack.empty())
{
node = stack.pop();
node = node.right;
}
}
return list; }
}

LinkBinTree的更多相关文章

随机推荐

  1. Django项目部署到阿里云服务器无法发送邮件,发送邮件超时问题解决

    前言 今天, 博主将写了好久的一个Django小项目尝试在阿里云部署上线,由于项目中需要发送邮件,博主调用了163邮箱接口,在本地测试邮件功能正常,可是上线后,邮件功能一直超时崩溃.在百度一番查资料后 ...

  2. Mysql - 整数类型的存储字节数和范围

    MySQL 整数类型的存储字节数和范围 type 存储字节数 有符号最小值 无符号最小值 有符号最大值 无符号最大值 TINYINT 1 -128 0 127 255 SMALLINT 2 -3276 ...

  3. JAVA线上常见问题排查手段(小结)

    在平时开发过程中,对于线上问题的排查以及系统的优化,免不了和Linux进行打交道.每逢大促和双十一,对系统的各种压测性能测试,优化都是非常大的一次考验.抽空整理了一下自己在线上问题排查以及系统优化的一 ...

  4. react之redux状态管理

    1.传统MVC框架的缺陷 模型(model)-视图(view)-控制器(controller)的缩写 V即View视图:用户看到并与之交互的界面. M即Model模型是管理数据:很多业务逻辑都在模型中 ...

  5. c语言循环位移(数字,字符串)

    C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位 设一个操作数x有s位则循环左移n位的操作为: (x << n) | (x >> (s - n)); 同理右移 ...

  6. jpg与jpeg的区别在哪

    JPG文件的优点是体积小巧,并且兼容性好,因为大部分的程序都能读取这种文件,这是因为JPG格式不仅是一个工业标准格式,而且更是web的标准文件格式.JPG文件如此拥有如此便利的条件,难怪得到了业余玩家 ...

  7. Kubernetes(K8s)极速入门

    1. 概述 老话说的好:努力学习,努力提高,做一个有真才实学的人. 言归正传,之前我们聊了 如何使用国内的镜像源搭建 kubernetes(k8s)集群 ,今天我们来聊聊如何在 kubernetes( ...

  8. salesforce零基础学习(一百零九)Lightning Login启用以及配置

    本篇参考:https://help.salesforce.com/s/articleView?id=sf.security_ll_overview.htm&type=5 我们在之前的篇中提到过 ...

  9. Kubernetes-网络

    前言 本篇是Kubernetes第十一篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战,此篇文章概念比较多,后续我会继续出一些网络相关实战以及原理探索篇. Kubernetes系列文章: K ...

  10. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ

    众所周知,tzc 在 2019 年(12 月 31 日)就第一次开始接触多项式相关算法,可到 2021 年(1 月 1 日)才开始写这篇 blog. 感觉自己开了个大坑( 多项式 多项式乘法 好吧这个 ...