二叉树的创建和遍历

给定一个确定的数组,然后构建一棵二叉树,并分别使用递归和非递归的方式进行遍历。


import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
 * 建树思路:
* 	首先把所有的数创建为节点依次存入有序集合中
* 	对于数列中的前 n/2-1 个都为父节点,因此遍历父节点构建树
* 		每一个父节点都创建对应的孩子(左孩子:父节点*2+1;右孩子:父节点*2+2)
* 		对于最后一个父节点(即下标是 n*2-1 的节点)根据数列个数的奇偶值判断有没有右孩子
* 	最后返回根节点(存入的第一个数)
*/
public class BinaryTree {
	//	先序遍历:
	//	1 2 4 8 9 5 3 6 7 
	//	中序遍历:
	//	8 4 9 2 5 1 6 3 7 
	//	后序遍历:
	//	8 9 4 5 2 6 7 3 1 
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5,6,7,8,9};
		
		Node root = createBinTree(arr);

		System.out.println("\n先序遍历的结果(递归):");
		preOrderTraverse(root);
		
		System.out.println("\n先序遍历的结果(非递归):");
		preOrderTraverse2(root);
	}
	
	private static void preOrderTraverse2(Node root) {
		Stack<Node> stack = new Stack<>();
		stack.add(root);
		while(!stack.isEmpty()) {
			Node t = stack.pop();
			while(t != null) {
				System.out.print(t.data + " ");
				if(t.rChild != null)
					stack.push(t.rChild);
				t = t.lChild; //必须在右孩子入栈之后,否则右孩子不再是原来t的右孩子
			}
		}
	}

	private static void preOrderTraverse(Node root) {
		if(root == null)
			return ;
		System.out.print(root.data+" ");
		preOrderTraverse(root.lChild);
		preOrderTraverse(root.rChild);
	}
	
	private static Node createBinTree(int[] arr) {
		List<Node> list = new LinkedList<Node>();
		int len = arr.length;
		
		for(int i=0; i<len; i++) {
			list.add(new Node(arr[i]));
		}
		
		for(int i=0; i<len/2-1; i++) {
			list.get(i).lChild = list.get(i*2+1);
			list.get(i).rChild = list.get(i*2+2);
		}
		
		//最后一个父节点需要特判(当数列为奇数时才可以有右孩子)
		int lastIndex = len / 2 - 1;
		list.get(lastIndex).lChild = list.get(lastIndex*2+1);
		if(len % 2 == 1)
			list.get(lastIndex).rChild = list.get(lastIndex*2+2);
		
		//返回根节点
		return list.get(0);
	}

	private static class Node{
		int data;
		Node lChild;
		Node rChild;
		
		public Node(int data) {
			super();
			this.data = data;
			this.lChild = null;
			this.rChild = null;
		}
	}
}

运行结果:


阅读了很多网上的博客才整理出来的,如有错误或者不合理的地方,敬请指正哦~

 

坚持!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值