this.rchild = rchild;
}
public void setData(E data){
this.data = data;
}
public E getData(){
return this.data;
}
public void setLchild(TreeNode lchild){
this.lchild = lchild;
}
public TreeNode getLchild(){
return this.lchild;
}
public void setRchild(TreeNode rchild){
this.rchild = rchild;
}
public TreeNode getRchild(){
return this.rchild;
}
}
二叉树的Java实现:
import java.util.linkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
public class BinaryTree {
private TreeNode root; //根节点
private List nodeList = null; //二叉树节点的链式结构
public BinaryTree(){
}
public BinaryTree(TreeNode root){
this.root = root;
}
//把一个数组转化为一颗完全二叉树
public TreeNode buildTree(E[] array){
nodeList = new linkedList();
//将数组中的元素依次转换为TreeNode节点,存放于链表中
for(int i=0; i< array.length; i++){
nodeList.add(new TreeNode(array[i]));
}
//对前(array.length / 2 - 1)个父节点,按照父节点与孩子节点的数字关系建立完全二叉树
//对完全二叉树,按从上到下,从左到右的顺序依次编号0,1,2,3…N,则i>0的节点,其左孩子为(2*i+1),
//其右孩子为(2*i+2)
for(int j=0; j < (array.length/2-1);j++){
//左孩子
nodeList.get(j).setLchild(nodeList.get(j*2+1));
//右孩子
nodeList.get(j).setRchild(nodeList.get(j*2+2));
}
//最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独处理
int index = array.length/2 -1;
//左孩子
nodeList.get(index).setLchild(nodeList.get(index*2+1));
//右孩子:如果数组的长度为奇数才有右孩子
if(array.length % 2 == 1){
nodeList.get(index).setRchild(nodeList.get(index*2+2));
}
root=nodeList.get(0); //设置根节点
return root;
}
//得到树的高度
public int height(TreeNode node){
if(node == null){
return 0;
}else{
int i = height(node.getLchild());
int j = height(node.getRchild());
return (i } } //得到节点的个数 public int size(TreeNode node){ if(node == null){ return 0; }else{ return 1+ size(node.getLchild())+size(node.getRchild()); } } //递归实现先序遍历 NLR public void preOrder(TreeNode node){ if(node != null){ System.out.print(node.getData() + " "); preOrder(node.getLchild()); preOrder(node.getRchild()); } } //非递归实现先序遍历 NLR public void nonRecPreOrder(TreeNode node){ Stack TreeNode nodeTemp = node; //nodeTemp作为遍历指针 while(nodeTemp != null || !nodeStack.isEmpty()){ //当nodeTemp非空或栈非空时循环 if(nodeTemp != null){ //根指针非空,遍历左子树 nodeStack.push(nodeTemp); //根指针进栈 System.out.print(nodeStack.peek().getData() + " "); //根指针退栈,访问根节点 nodeTemp = nodeTemp.getLchild(); //每遇到非空二叉树先向左走 }else{ //再向右子树走 nodeTemp = nodeStack.pop(); nodeTemp = nodeTemp.getRchild(); } } } //递归实现中序遍历 LNR public void inOrder(TreeNode node){ if(node != null){ inOrder(node.getLchild()); System.out.print(node.getData() + " "); inOrder(node.getRchild()); } } //非递归实现中序遍历 LNR public void nonRecInOrder(TreeNode node){ Stack TreeNode nodeTemp = node; //nodeTemp作为遍历指针 while(nodeTemp != null || !nodeStack.isEmpty()){ //当nodeTemp非空或栈非空时循环 if(nodeTemp != null){ //根指针非空,遍历左子树 nodeStack.push(nodeTemp); //根指针进栈 nodeTemp = nodeTemp.getLchild(); //每遇到非空二叉树先向左走 }else{ nodeTemp = nodeStack.pop(); //根指针退栈,访问根节点 System.out.print(nodeTemp.getData() +" "); nodeTemp = nodeTemp.getRchild(); //再向右子树走 } } } //递归实现后序遍历 LNR public void postOrder(TreeNode node){ if(node != null){ postOrder(node.getLchild()); postOrder(node.getRchild()); System.out.print(node.getData() + " "); } } //非递归实现后序遍历 LNR public void nonRecPostOrder(TreeNode node){ Stack TreeNode nodeTemp = node; //nodeTemp作为遍历指针 TreeNode preNode = null; //表示最近一次访问的节点 while(nodeTemp != null || !nodeStack.isEmpty()){ //当nodeTemp非空或栈非空时循环 while(nodeTemp != null){ //一直向左走,遍历左子树 nodeStack.push(nodeTemp); nodeTemp = nodeTemp.getLchild(); } nodeTemp = nodeStack.peek(); if(nodeTemp.getRchild()==null || nodeTemp.getRchild() == preNode){ //右子树为空或右子树已被访问时,该节点出栈 nodeTemp = nodeStack.pop(); System.out.print(nodeTemp.getData()+" "); preNode = nodeTemp; //将该节点赋值给最近一个访问节点 nodeTemp = null; //此处很重要,将刚出栈节点设置为空,对应于while循环的条件之一,否则陷入死循环 }else{ nodeTemp = nodeTemp.getRchild(); //遍历右子树 } } } //层次遍历 public void levelOrder(TreeNode root){ Queue TreeNode node = null; nodeQueue.add(root); //将根节点入队 while(!nodeQueue.isEmpty()){ //队列不空循环 node = nodeQueue.peek(); System.out.print(node.getData()+" "); nodeQueue.poll(); //队头元素出队 if(node.getLchild() != null){ //左子树不空,则左子树入队列 nodeQueue.add(node.getLchild()); } if(node.getRchild() != null){ //右子树不空,则右子树入队列 nodeQueue.add(node.getRchild()); } } } public static void main(String args[]){ //将一个数组转化为一颗完全二叉树 Object[] array = {1,2,3,4,5,6,7,8}; BinaryTree bt = new BinaryTree(); TreeNode root = bt.buildTree(array); System.out.print(“树的高度:”); System.out.println(bt.height(root)); System.out.print(“节点的个数:”); System.out.println(bt.size(root)); System.out.println(“先序遍历:”); bt.preOrder(root); System.out.println("n"+“非递归先序遍历:”); bt.nonRecPreOrder(root); System.out.println(); System.out.println(“中序遍历:”);【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取



