数据结构Java版-树

这里的树通常是指二叉树。
class  TreeNode{
     int  value;
     TreeNode left;
     TreeNode right;
public class TreeNode {
	public static void main(String[] args) {

		Tree A = new Tree("A");

		Tree B = new Tree("B");
		Tree C = new Tree("C");

		Tree D = new Tree("D");
		Tree E = new Tree("E");
		Tree F = new Tree("F");
		Tree G = new Tree("G");

		Tree H = new Tree("H");
		Tree I = new Tree("I");
		Tree J = new Tree("J");
		Tree K = new Tree("K");

		A.left = B;
		A.right = C;

		B.left = D;
		B.right = E;
		C.left = F;
		C.right = G;

		D.left = H;
		D.right = I;
		E.left = J;
		E.right = K;

		// 先序遍历
		// A,B,D,H,I,E,J,K,C,F,G
		/*
		 * ArrayList<String> list = new ArrayList<String>(); Stack<Tree> mStack
		 * = new Stack<Tree>(); mStack.push(A); while(mStack.size()!=0){ Tree p
		 * = mStack.pop(); list.add(p.value);
		 * 
		 * if(p.right!=null){ mStack.push(p.right); }
		 * 
		 * if(p.left!=null){ mStack.push(p.left); } }
		 */
		// 中序遍历
		// H,D,I,B,J,E,K,A,F,C,G
		ArrayList<String> list = new ArrayList<String>();
		Stack<Tree> mStack = new Stack<Tree>();
		/*Tree p = A;
		while (mStack.size() != 0 || p != null) {
			if (p != null) {
				mStack.push(p);
				p = p.left;
			} else {
				Tree t = mStack.pop();
				list.add(t.value);
				p = t.right;
			}
		}*/

		// 后序遍历
		// H,I,D,J,K,E,B,F,G,C,A
		mStack.push(A);
		Tree prev = null;
		while(!mStack.empty()){
			Tree tmp = mStack.peek();
			if(prev == null ||prev.left == tmp ||prev.right == tmp){
				if(tmp.left!= null){
					mStack.push(tmp.left);
				}else if(tmp.right != null){
					mStack.push(tmp.right);
				}else {
					mStack.pop();
					list.add(tmp.value);
				}
			}else if(tmp.left == prev){
				if(tmp.right != null){
                    mStack.push(tmp.right);
                }else{
                    mStack.pop();
                    list.add(tmp.value);
                }
			}else if(tmp.right == prev){
				mStack.pop();
				list.add(tmp.value);
			}
			prev = tmp;
		}
		for (String str : list) {
			System.out.print(str + ",");
		}
	}
}

class Tree {
	String value;
	Tree left;
	Tree right;

	Tree(String x) {
		this.value = x;
		this.left = null;
		this.right = null;
	}
}


下面是一些与二叉树有关的概念:
二叉树搜索: 对于所有节点,顺序是:left children <= current node <= right children;
平衡vs.非平衡: 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;
满二叉树: 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点;
完美二叉树(Perfect Binary Tree): 一个满二叉树,所有叶子都在同一个深度或同一级,并且每个父节点都有两个子节点;
完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值