二叉树


一、二叉树是什么

  • 一种特殊的树形结构,每个节点至多只有两颗子树 (只有一个也是二叉树)。
  • 下面这个也是二叉树。
    在这里插入图片描述

二、二叉树基本概念

  1. 结点:树里面的元素。

  2. 结点的高度:结点到叶子结点的最长路径
    在这里插入图片描述

  3. 结点的深度:根结点到该结点的边个数
    在这里插入图片描述

  4. 结点的层数:结点的深度加1

  5. 树的高度:根结点的高度。

  6. 注:树的高度是根节点的高度,之前的针对结点,第5个是针对树

  7. 最后再放一张图便于理解。

  8. 其实我感觉这里可以这么理解,就把根节点当成是地平线,二叉树就是根,那些个结点就是根瘤菌,那个根瘤菌的深度就是,地平线到这个根瘤菌的长度(边的个数)

  9. 高度的话,肯定就是以最下面的根瘤菌为基准了,就是这个根瘤菌到最下面根瘤菌的距离
    10.层数就是把地平线也算一层,就是深度加1。
    在这里插入图片描述

三、二叉树分类

  • 满二叉树
    在这里插入图片描述
  • 完全二叉树(也属于满二叉树)也叫堆,下边这两个都是完全二叉树
    在这里插入图片描述

四、二叉树的遍历

在这里插入图片描述

前序遍历

  • 如上图所示,前序遍历总结一下就是根左右
  • 根节点输出
  • 如果到了左边的节点,就把那个结点当作根节点,剩下的作为子树继续遍历
  • 以上述二叉树为例,最开始把A输出之后
  • 就到了左节点B,然后把B以下的节点作为一颗子树,进行前序遍历。
  • 如下图
  • 然后,直到遍历到D,开始遍历右节点E了。
    在这里插入图片描述
  • 所以其代码为:
// 前序遍历
	public void pre(TreeNode root) {
		// 根节点输出
		printNode(root);
		//左
		if (root.getLeft() != null) {
		 //把左边结点当作根节点,以前序遍历的方式遍历以其作为节点的子树
			pre(root.getLeft());
		}
		//右
		if (root.getRight() != null) {
		//把右边结点当作根节点,以前序遍历的方式遍历以其作为节点的子树
			pre(root.getRight());
		}
	}

中序遍历

  • 左根右
  • 中序遍历和前序遍历差不多,只是根节点是在左边子树遍历之后才输出,然后在遍历右边子树
  • 其代码为:
// 中序遍历
	public void mid(TreeNode root) {
		// 左
		if (root.getLeft() != null) {
			mid(root.getLeft());
		}
		// 根
		printNode(root);
		// 右
		if (root.getRight() != null) {
			mid(root.getRight());
		}
	}

后序遍历

  • 左右根
  • 这个是最后输出根节点,先遍历左子树,在遍历右子树
  • 代码:
// 后序遍历
	public void post(TreeNode root) {
		// 左
		if (root.getLeft() != null) {
			post(root.getLeft());
		}
		
		// 右
		if (root.getRight() != null) {
			post(root.getRight());
		}
		
		// 根
		printNode(root);
	}
	

遍历的完整代码

public class BinaryTree {

	// 打印
	public void printNode(TreeNode node) {
		System.out.print(node.getData());
	}

	// 前序遍历
	public void pre(TreeNode root) {
		// 根节点输出
		printNode(root);
		//左
		if (root.getLeft() != null) {
			pre(root.getLeft());
		}
		//右
		if (root.getRight() != null) {
			pre(root.getRight());
		}
	}

	// 中序遍历
	public void mid(TreeNode root) {
		// 左
		if (root.getLeft() != null) {
			mid(root.getLeft());
		}
		// 根
		printNode(root);
		// 右
		if (root.getRight() != null) {
			mid(root.getRight());
		}
	}

	// 后序遍历
	public void post(TreeNode root) {
		// 左
		if (root.getLeft() != null) {
			post(root.getLeft());
		}
		
		// 右
		if (root.getRight() != null) {
			post(root.getRight());
		}
		
		// 根
		printNode(root);
	}

	public static void main(String[] args) {
		//创建二叉树
		TreeNode D = new TreeNode('D',null,null);
		TreeNode E = new TreeNode('E',null,null);
		TreeNode B = new TreeNode('B',D,E);
		TreeNode F = new TreeNode('F',null,null);
		TreeNode G = new TreeNode('G',null,null);
		TreeNode C = new TreeNode('C',F,G);
		TreeNode A = new TreeNode('A',B,C);
		
		BinaryTree binary = new BinaryTree();
		binary.pre(A);
		System.out.println();
		binary.mid(A);
		System.out.println();
		binary.post(A);
	}
}

class TreeNode {

	private char data;
	private TreeNode left;
	private TreeNode right;

	TreeNode(char data, TreeNode left, TreeNode right) {
		this.data = data;
		this.left = left;
		this.right = right;
	}

	public char getData() {
		return data;
	}

	public void setData(char data) {
		this.data = data;
	}

	public TreeNode getLeft() {
		return left;
	}

	public void setLeft(TreeNode left) {
		this.left = left;
	}

	public TreeNode getRight() {
		return right;
	}

	public void setRight(TreeNode right) {
		this.right = right;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值