二叉树

(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:
1)有且仅有一个特定的称为根(Root)的结点;
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。

结点的度

结点拥有的子树数目称为结点的度。
在这里插入图片描述

二叉树

二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树
无任何节点

(2)只有一个根结点的二叉树
在这里插入图片描述

(3)只有左子树
在这里插入图片描述
(4)只有右子树
在这里插入图片描述
(5)完全二叉树
在这里插入图片描述
完全二叉树特点:

叶子结点只能出现在最下一层(满二叉树继承而来)
最下层叶子结点一定集中在左 部连续位置。
倒数第二层,如有叶子节点,一定出现在右部连续位置。
同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。

(6)满二叉树
在这里插入图片描述

所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上

二叉树遍历

前序遍历:
先计算本节点,再递归遍历左树,再递归遍历右树
中序遍历:
先递归遍历左树,计算本节点,再递归遍历右树
后序遍历:
先递归遍历左树,再递归遍历右树,计算本节点

package com.gf;

import java.util.ArrayList;
import java.util.List;

public class TreeNode {
	private String name = null;
	private TreeNode leftNode = null;
	private TreeNode rightNode = null;
	
	public TreeNode(String name)
	{
		this.name =name;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public TreeNode getLeftNode() {
		return leftNode;
	}
	public void setLeftNode(TreeNode leftNode) {
		this.leftNode = leftNode;
	}
	public TreeNode getRightNode() {
		return rightNode;
	}
	public void setRightNode(TreeNode rightNode) {
		this.rightNode = rightNode;
	}
	
	public static TreeNode initTree()
	{
		TreeNode root = new TreeNode("ROOT");
		TreeNode leftA = new TreeNode("LeftA");
		root.setLeftNode(leftA);
		TreeNode rightB = new TreeNode("rightB");
		root.setRightNode(rightB);
		
		TreeNode leftA1 = new TreeNode("LeftA1");
		leftA.setLeftNode(leftA1);
		TreeNode leftA2 = new TreeNode("LeftA2");
		leftA.setRightNode(leftA2);
		
		TreeNode rightB1 = new TreeNode("rightB1");
		rightB.setLeftNode(rightB1);
		TreeNode rightB2 = new TreeNode("rightB2");
		rightB.setRightNode(rightB2);
		
		return root;
	}
	
	//前序遍历
	public static void forwardIterate(TreeNode tn)
	{
		String name = tn.getName();
		System.out.print(name+",");
		TreeNode leftNode = tn.getLeftNode();
		if(leftNode != null)
			forwardIterate(leftNode);
		TreeNode rightNode = tn.getRightNode();
		if(rightNode != null)
			forwardIterate(rightNode);
	}
	
	//中序遍历
	public static void middleIterate(TreeNode tn)
	{
		TreeNode leftNode = tn.getLeftNode();
		if(leftNode != null)
			middleIterate(leftNode);
		
		String name = tn.getName();
		System.out.print(name+",");
		
		TreeNode rightNode = tn.getRightNode();
		if(rightNode != null)
			middleIterate(rightNode);
	}
	
	//后序遍历
	public static void lastIterate(TreeNode tn)
	{
		TreeNode leftNode = tn.getLeftNode();
		if(leftNode != null)
			lastIterate(leftNode);
		
		TreeNode rightNode = tn.getRightNode();
		if(rightNode != null)
			lastIterate(rightNode);
		
		String name = tn.getName();
		System.out.print(name+",");
	}
	
	public static void main(String[] args)
	{
		TreeNode root = TreeNode.initTree();
		forwardIterate(root);
		System.out.println("\n===");
		middleIterate(root);
		System.out.println("\n===");
		lastIterate(root);
	}
	
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值