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的更多相关文章
随机推荐
- js 鼠标和键盘事件
js 鼠标和键盘事件 鼠标事件 聚焦事件 离焦事件 鼠标单击和双击 鼠标的其他事件 鼠标事件对象 键盘事件 鼠标事件 聚焦事件 <input type="text" id=& ...
- Linux 下权限的管理
Linux 下权限的管理 我们都知道,Linux系统对于用户的权限管理是十分严格的. 那么,我们就来具体了解一下. 一. 用户 在Linux中按照类型用户分为两种:1.超级用户 2.普通用户 那么它们 ...
- java中的lamda表达式
List操作: 循环: list.forEach((p) -> System.out.printf("%s %s; %n", p.getFirstName(), p.getL ...
- 关于Thread的interrupt
关于Thread的interrupt Thread的interrupt方法会引发线程中断. 主要有以下几个作用: 如Object的wait方法,Thread的sleep等等这些能够抛出Interrup ...
- [hdu7011]被EI加0了
注意到仅关心于权值大小,预处理出$F_{i}(n)$表示$a_{1},a_{2},...,a_{n}$中恰填$i$种不同的数的方案数,那么显然答案即为$\sum_{i=1} ...
- 【Java面试】-- 杂题
杂题 2019-11-03 21:09:37 by冲冲 1.类加载器的双亲委派机制 类加载器:把类通过类加载器加载到JVM中,然后转换成class对象(通过类的全路径来找到这个类). 双亲委派机制 ...
- spring-整合es
spring-整合es 导入pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- ant的xml解释
ant必须以<project>开始和</project>结束 --project(父节点) --target(子节点) ---javac(孙节点) ---echo(孙节点)
- 定时任务注解@Scheduled
概述 要使用@ Scheduled注解,首先需要在启动类添加@ EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@ Sche ...
- CF1445E four points
我们不妨枚举四个点的移动方向. 那我们可以直接算出在该情况的最优的答案. #include<iostream> #include<cstdio> #include<alg ...