LinkBinTree
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的更多相关文章
随机推荐
- 简单理解函数声明(以signal函数为例)
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...
- 第39篇-Java通过JNI调用C/C++函数
在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...
- 3D 穿梭效果?使用 UWP 也能搞定
昨天 ChokCoco 大佬搞了个 3D 穿梭效果出来,具体可见这里: 3D 穿梭效果?使用 CSS 轻松搞定 这个效果太神奇了,他还问我能不能用 WPF 搞出来,因为我完全没用过 WPF 的 3D, ...
- MAC VMware fusion 12.1.0 Centos7 网络配置
虚拟机选择NAT模式 获取mac机器中vmnet8的gateway地址 找到 # NAT gateway address这一行,下面的ip就是gateway地址 cat /Library/Prefer ...
- Python如何格式化输出
目录 Python中的格式化输出 1.旧格式化 2.新格式format( ) 函数 Python中的格式化输出 格式化输出就是将字符串中的某些内容替换掉再输出就是格式化输出 旧格式化输出常用的有%d( ...
- Java设计模式之(二)——工厂模式
1.什么是工厂模式 Define an interface for creating an object,but let subclasses decide which class toinstant ...
- 如何使用原生的Hystrix
什么是Hystrix 前面已经讲完了 Feign 和 Ribbon,今天我们来研究 Netflix 团队开发的另一个类库--Hystrix. 从抽象层面看,Hystrix 是一个保护器.它可以保护我们 ...
- Stream流的使用
创建流 创建流的方式很多,从jdk8起,很多类中添加了一些方法来创建相应的流,比如:BufferedReader类的lines()方法:Pattern类的splitAsStream方法.但是开发中使用 ...
- SpringBoot引入第三方jar的Bean的三种方式
在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便. 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式. 一.注解 ...
- Nginx编译安装相关参数
Nginx编译安装相关参数 Nginx插件安装 ------------------pcre------------------ cd /usr/local/source wget http://ww ...