二叉树之二叉链表
作者:网络转载 发布时间:[ 2016/12/1 10:45:04 ] 推荐标签:二叉树 .NET
/**
* 求二叉树中特定子结点的父结点
* @param root
* @param childNode
* @return 存在父结点时,返回父结点;否则,返回null
*/
public BinaryTreeNode<E> getParent(BinaryTreeNode<E> root, BinaryTreeNode<E> childNode){
if(root == null){
return null;
}
if(root.leftChild == childNode || root.rightChild == childNode){
return root;
}
if(getParent(root.leftChild, childNode) != null){
return getParent(root.leftChild, childNode);
}else{
return getParent(root.rightChild, childNode);
}
}
/**
* 递归删除二叉树,释放相应的存储空间
* @param root
*/
public void destoryBinaryTree(BinaryTreeNode<E> root){
if(root != null){
destoryBinaryTree(root.leftChild);
destoryBinaryTree(root.rightChild);
root = null;
}
}
/**
* 层序遍历(广度优先遍历)
* @param root
*/
public void levelOrder(BinaryTreeNode<E> root){
Queue<BinaryTreeNode<E>> queue = new LinkedBlockingQueue<BinaryTreeNode<E>>();
BinaryTreeNode<E> pointer = root;
/**
* 当前结点非空时,放入队首
*/
if(pointer != null){
queue.add(pointer);
}
/*
* 队列不为空时,先访问中间节点,访问完成后弹出队首节点;然后是左节点,再是右节点;
*/
while(!queue.isEmpty()){
pointer = queue.peek();
visit(pointer);
queue.remove();
if(pointer.leftChild != null){
queue.add(pointer);
}
if(pointer.rightChild != null){
queue.add(pointer);
}
}
}
/**
* 递归先序遍历二叉树
* @param root
*/
public void preOrder(BinaryTreeNode<E> root){
if (root == null){
return;
}
visit(root);
preOrder(root.leftChild);
preOrder(root.rightChild);
}
/**
* 非递归先序遍历二叉树
* @param root
*/
public void nPreOrder(BinaryTreeNode<E> root){
Stack<BinaryTreeNode<E>> stack = new Stack<BinaryTreeNode<E>>();
BinaryTreeNode<E> pointer = root;
while(!stack.isEmpty() || pointer != null){
if(pointer != null){
visit(pointer);
if(pointer.rightChild != null){
stack.push(pointer.rightChild);
}
pointer = pointer.leftChild;
}else{
pointer = stack.pop();
}
}
}
/**
* 递归中序遍历
* @param root
*/
public void inOrder(BinaryTreeNode<E> root){
if (root == null){
return;
}
inOrder(root.leftChild);
visit(root);
inOrder(root.rightChild);
}
/**
* 非递归中序遍历1
* @param root
*/
public void nInOrder(BinaryTreeNode<E> root){
Stack<BinaryTreeNode<E>> stack = new Stack<BinaryTreeNode<E>>();
BinaryTreeNode<E> pointer = root;
while(pointer != null || !stack.isEmpty()){
if(pointer != null){
stack.push(pointer);
pointer = pointer.leftChild;
}else{
pointer = stack.pop();
visit(pointer);
pointer = pointer.rightChild;
}
}
}
/**
* 非递归中序遍历2
* @param root
*/
public void nInOrders(BinaryTreeNode<E> root){
Stack<BinaryTreeNode<E>> stack = new Stack<BinaryTreeNode<E>>();
BinaryTreeNode<E> pointer = root;
stack.push(pointer);
while(!stack.isEmpty()){
while(pointer != null){
stack.push(pointer.leftChild);
pointer = pointer.leftChild;
}
stack.pop();
if(!stack.isEmpty()){
pointer = stack.pop();
visit(pointer);
pointer = pointer.rightChild;
stack.push(pointer);
}
}
}
/**
* 递归后序遍历
* @param root
*/
public void postOrder(BinaryTreeNode<E> root){
if (root == null){
return;
}
postOrder(root.leftChild);
postOrder(root.rightChild);
visit(root);
}
/**
* 非递归后序遍历
* @param root
*/
public void nPostOrder(BinaryTreeNode<E> root){
Stack<BinaryTreeNode<E>> stack = new Stack<BinaryTreeNode<E>>(); //初始化栈,用于保存带访问的节点
BinaryTreeNode<E> pointer = root; //保存根节点
BinaryTreeNode<E> preNode = root; //保存前一个被访问的节点
while(!stack.isEmpty() || pointer != null){
//若当前节点不空,一直进栈,然后继续向左走
while(pointer.leftChild != null){
stack.push(pointer);
pointer = pointer.leftChild;
}
/*
* 当前节点为空时,分两种情况:
* 1、当前节点移动到栈顶处,然后访问栈顶元素的右节点
* 2、当前节点移动到栈顶,但是栈顶元素没有右节点,这需要弹出栈顶元素,再对此元素访问;
* 然后再对新的栈顶元素进行判断即可
*/
while((pointer != null && pointer.rightChild == null) || pointer.rightChild == preNode){
visit(pointer);
preNode = pointer;
if(stack.isEmpty()){
return;
}
pointer = stack.pop();
}
stack.push(pointer);
pointer = pointer.rightChild;
}
}
/**
* 访问当前结点
* @param current
*/
public void visit(BinaryTreeNode<E> current){
if(current != null && current.element != null){
System.out.println(current.element);
}else{
System.out.println("null");
}
}
}
3. 参考文献
1. java创建二叉树并递归遍历二叉树
2. java实现二叉树相关代码—–数据结构
3. Java实现二叉树的创建、递归/非递归遍历
4. Java实现二叉树的创建和遍历操作(有更新)
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
编程常用的几种时间戳转换(java .net 数据库).Net中关于相等的问题Asp.net MVC如何对所有用户输入的字符串字段做Trim处理Asp.Net WebForm生命周期的详解.Net开发的两个小技巧asp.net 六大内置对象.Net基础体系和跨框架开发普及Linux使用Jexus托管Asp.Net Core应用程序asp.net登录验证码实现方法ASP.NET自带对象JSON字符串与实体类的转换从 .NET 和 Java 之争谈 IT 行业.Net高效开发之不可错过的实用工具ASP.NET MVC必须知道的那些事!.NET中使用无闪刷新控件时提示框不显示.net开发中要注意的事项Asp.net Core MVC中使用Session
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南