栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现链式存储的二叉树,腾讯java社招面试经验

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现链式存储的二叉树,腾讯java社招面试经验

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

}

}

//得到节点的个数

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

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 nodeStack = new 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 nodeStack = new 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 nodeStack = new 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 nodeQueue = new linkedList();

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(“中序遍历:”);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446097.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号