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. CTF-Tools 一款CTF古典密码加解密工具

    CTF-Tools 一款CTF古典密码加解密工具 工具截图 工具简介 一款CTF编码.解码.加密.解密工具. 支持的编码解码: URL-UTF-8 URL-GB2312 Unicode Escape( ...

  2. maven项目中 把依赖包打进jar包

    在pom.xml文件中增加build配置 1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-as ...

  3. MarkdownPad2 注册码

    邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6b ...

  4. Part 16 ng include directive in AngularJS

    ng-include directive is used to embed an HTML page into another HTML page. This technique is extreme ...

  5. c++学习笔记3(内联函数)

    函数调用是有开销的,调用时需将参数放入栈中,返回地址也要放入,返回时还需从栈中取出,跳转返回地址去执行,需几条语句的时间,如果本身程序代码短,则会显得十分浪费,所以引入了内联函数的机制 写法:在函数前 ...

  6. 体验用yarp连接websocket

    前段时间一看yarp的仓库,wow,终于发布1.0版本了..net也升级到6版本了,之前一直只是用yarp做HTTP转发,今天刚好试试websocket 话不多说,直接开搞 配置集群 首先先配置集群信 ...

  7. 『学了就忘』Linux软件包管理 — 44、在RPM包中提取文件

    目录 1.RPM包中文件的提取 2.在RPM包中提取文件的操作 (1)cpio命令介绍 (2)提取RPM包中文件 1.RPM包中文件的提取 为什么要做这个事呢? 在操作Linux系统的时候误删除一个文 ...

  8. 【linux系统】命令学习(八)bash 编程实战学习

    常见shell : bash  sh zsh windows: git bash    cygwin MAC : terminal iterm netstat 是linux下用于显示网络状态的命令.通 ...

  9. Jetpack架构组件学习(1)——LifeCycle的使用

    原文地址:Jetpack架构组件学习(1)--LifeCycle的使用 | Stars-One的杂货小窝 要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 最近 ...

  10. 从零开始学Kotlin第五课

    函数式编程入门: package EL fun main(args: Array<String>) { var names= listOf<String>("tom& ...