【读书笔记】数据结构与算法经典问题解析——Java语言描述【树】

基本概念

  • 树的定义:树是一种典型的非线性结构。树结构是表达具有层次特性的图结构的一种方法。元素的顺序不是考虑的重点,若需要用到元素顺序信息,可以使用链表、栈、队列等线性数据结构。
  • 结点的深度:是指从根节点到该结点的路径长度。
  • 结点的高度:是指从该结点到最深结点的路径长度
  • 树的高度:是树中所有结点高度的最大值(树的深度同理)
  • 其余的基本概念不表。

二叉树

  • 类型:严格二叉树,满二叉树,完全二叉树
  • 结构:假定结点数据为整数,两个指向左右孩子的指针。
public class BinaryTreeNode {
	private int data;
	private BinaryTreeNode left;
	private BinaryTreeNode right;
	public Object getters(){
		// to be implemented
		return null;
	}
	public void setters(){
		// to be implemented
	}
}

  • 二叉树遍历:D为结点,L为D的左孩子结点,R为D的右孩子结点;
  • 前序遍历:DLR
/**
	 * 递归版本前序遍历
	 * @param root
	 */
	void preOrder(BinaryTreeNode root){
		if(root!=null){
			System.out.println(root.getData());
			preOrder(root.left);
			preOrder(root.right);
		}
	}

/**
	 * 循环版本前序遍历
	 * @param root
	 */
	void preOrderNonRecursive(BinaryTreeNode root){
		if(root==null) return;
		Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
		while(true){
			while(root!=null){
				System.out.println(root.getData());
				stack.push(root);
				root = root.getLeft();
			}
			if(stack.isEmpty()) break;
			root = (BinaryTreeNode) stack.pop();
			root = root.getRight();
		}
	}
  • 中序遍历:LDR
    /**
    	 * 递归版本中序遍历
    	 * @param root
    	 */
    	void inOrder(BinaryTreeNode root){
    		if(root!=null){
    			inOrder(root.getLeft());
    			System.out.println(root.getData());
    			inOrder(root.getRight());
    		}
    	}
  • /**
    	 * 循环版本中序遍历
    	 * @param root
    	 */
    	void inOrderNonRecursive(BinaryTreeNode root){
    		if(root==null) return;
    		Stack<BinaryTreeNode> stack = new Stack<>();
    		while(true){
    			while(root!=null){
    				stack.push(root);
    				root = root.getLeft();
    			}
    			if(stack.empty()) break;
    			root = (BinaryTreeNode) stack.pop();
    			System.out.println(root.getData());
    			root = root.getRight();
    		}
    	}
  • 后序遍历:LRD
  • /**
    	 * 递归版本后序遍历
    	 * @param root
    	 */
    	void postOrder(BinaryTreeNode root){
    		if(root!=null){
    			postOrder(root.getLeft());
    			postOrder(root.getRight());
    			System.out.println(root.getData());
    		}
    	}
    /**
    	 * 循环版本后序遍历,注意每个结点访问两次,检验是否有右子树
    	 * @param root
    	 */
    	void postOrderNonRecursive(BinaryTreeNode root){
    		if(root==null) return;
    		Stack<BinaryTreeNode> stack = new Stack<>();
    		while(true){
    			if(root!=null){
    				stack.push(root);
    				root = root.getLeft();
    			}else{
    				if(stack.isEmpty()){
    					System.out.println("Stack is empty");
    					return;
    				}
    				else if(stack.peek().getRight()==null){
    					root = stack.pop();
    					System.out.println(root.getData());
    					if(root==stack.peek().getRight()){
    						System.out.println(stack.peek().getData());
    						stack.pop();
    					}
    				}
    				if(stack.isEmpty()) root = stack.peek().getRight();
    				else root = null;
    			}
    		}
    	}



 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值