来玩二叉树【NO.1】--之遍历算法

什么是树形结构?

树是一种非线性的数据结构,相对于线性的数据结构(链表、数组)而言,树的平均运行时间更短(往往与树相关的排序时间复杂度都不会高)

那什么又是线性结构?

  • 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。
  • 线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的(类似数组),链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
  • 线性结构中存在两种操作受限的使用场景,即队列和栈。栈的操作只能在线性表的一端进行,就是我们常说的先进后出(FILO),队列的插入操作在线性表的一端进行而其他操作在线性表的另一端进行,先进先出(FIFO),由于线性结构存在两种存储结构,因
    此队列和栈各存在两个实现方式。

总结:
顺序结构主要有四种类型,顺序表(数组),链表,队列,栈(特殊的线性结构,栈是一种操作限定在表尾部进行的线性表,表尾称为栈顶,另一端固定不动,称为栈底)

树是非线性结构,那树又是什么样的?

来玩二叉树【NO.1】--之遍历算法_第1张图片
传统的树作为一种应用广泛的一对多非线性数据结构,不仅有数据间的指向关系,还有层级关系(父子关系,叶子关系是最大特点),因传统树的结构比较复杂,为了简化操作及存储,我们一般将树转换为二叉树处理

二叉树的结构和特点

来玩二叉树【NO.1】--之遍历算法_第2张图片
总结:

  • 一个二叉树至少会有一个节点(根节点)
  • 每个节点不能多于有两个子节点,若移除根节点则其余节点会被分成两个互不相交的子树,分别称为左子树和右子树
    来玩二叉树【NO.1】--之遍历算法_第3张图片
    满二叉树
      满二叉树,顾名思义除叶子节点外所有节点都拥有两个孩子,且叶子节点在同一层的二叉树,示例见图a。
    完全二叉树
      完全二叉树,移除最后一层节点后是满二叉树,且最后一层的节点都连续集中在最左面,示例见图b。

来玩二叉树,手动创建一个二叉树

二叉树是由若干个Node组成,一个Node维护一个元数据和两个指向其他Node的指针,相互连接在一起就形成二叉树。

定义一个TreeNode类,代表树结构

**
 * 代表二叉树结构
 * 
 * @author 张江丰
 *
 */
public class TreeNode {

	// 二叉树左节点
	private TreeNode leftNode;

	// 二叉树右节点
	private TreeNode rightNode;

	// 当前节点数据
	private int value;

	// 构造方法赋值
	public TreeNode(int value) {
		super();
		this.value = value;
	}

}

以下图二叉树创建为例
来玩二叉树【NO.1】--之遍历算法_第4张图片
根据图例创建节点并连接

public static void main(String[] args) {
		int[] Tarr = { 10, 8, 20, 15, 30 };

		TreeNode treeNode = new TreeNode(10);
		TreeNode treeNode2 = new TreeNode(8);
		TreeNode treeNode3 = new TreeNode(20);
		TreeNode treeNode4 = new TreeNode(15);
		TreeNode treeNode5 = new TreeNode(30);

		// 设置根节点,左儿子节点
		treeNode.setLeftNode(treeNode2);
		// 设置根节点,右儿子节点
		treeNode.setRightNode(treeNode3);
		// 设置20节点的左儿子节点
		treeNode3.setLeftNode(treeNode4);
		// 设置20节点的右儿子节点
		treeNode3.setRightNode(treeNode5);

	}

遍历二叉树的三种方式

  • 先序遍历

           先访问根节点,然后访问左节点,最后访问右节点(根->左->右)
    
  • 中序遍历

            先访问左节点,然后访问根节点,最后访问右节点(左->根->右)
    
  • 后序遍历

            先访问左节点,然后访问右节点,最后访问根节点(左->右->根)
    

递归算法分别实现遍历

// 先序遍历
	public static void befoTree(TreeNode tree) {

		if (tree != null) {

			if (tree.getValue() >= 0) {
				System.out.println(tree.getValue());
			}

			befoTree(tree.getLeftNode());
			befoTree(tree.getRightNode());

		}

	}

根据先序遍历的顺序(根->左->右),输出结果应该为10-8-20-15-30

// 中序遍历
	public static void betTree(TreeNode tree) {

		if (tree != null) {

			betTree(tree.getLeftNode());

			System.out.println(tree.getValue());

			betTree(tree.getRightNode());

		}

	}

根据中序遍历的顺序(左->根->右),输出结果应该为8-10-15-20-30

// 后序遍历
	public static void afterTree(TreeNode tree) {

		if (tree != null) {
			afterTree(tree.getLeftNode());

			afterTree(tree.getRightNode());

			System.out.println(tree.getValue());

		}

	}

根据后序遍历的顺序(左->右->根),输出结果应该为8-15-30-20-10

二叉树的简单入门完成了,后续更新二叉树的其他知识点,希望通过博客记录对自己和大家有所帮助。

你可能感兴趣的:(算法,二叉树,树结构,算法)