二叉树(Java)基本理解及实现

二叉树 (Java)

1. 二叉树概念

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
特点

  1. 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒
    在这里插入图片描述
2. 树名词含义

在这里插入图片描述
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
叶子节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
根结点:一棵树中,没有双亲结点的结点;如上图:A
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

3. 二叉树表现形式
  1. 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n
    个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全
    二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
  2. 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果
    一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	
	TreeNode(int x) { 
	val = x; 
	}

在这里插入图片描述

4. 二叉树的遍历

根据访问结点操作发生位置命名

  1. NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  2. LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  3. LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根
的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
在这里插入图片描述

5. 二叉树的层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历
在这里插入图片描述
创建一个树

class TreeNode {
    char value;
    TreeNode left;
    TreeNode right;
    public TreeNode(char value) {
        this.value = value;
    }
}

递归解法

前序遍历

public static void preOrderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.value + " ");
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);
    }

中序遍历

public static void preOrderRecur(TreeNode root) {
    if (root == null) {
        return;
    }
    preOrderRecur(root.left);
    System.out.print(root.value + " ");
    preOrderRecur(root.right);
}

后序遍历

public static void postOrderRecur(TreeNode root) {
    if root == null) {
        return;
    }
    postOrderRecur(root.left);
    postOrderRecur(root.right);
    System.out.print(root.value + " ");
}

迭代解法

前序遍历

public static void preOrderIteration(TreeNode root) {
	if (root == null) {
		return;
	}
	Stack<TreeNode> stack = new Stack<>();
	stack.push(root);
	while (!stack.isEmpty()) {
		TreeNode node = stack.pop();
		System.out.print(node.value + " ");
		if (node.right != null) {
			stack.push(node.right);
		}
		if (node.left != null) {
			stack.push(node.left);
		}
	}
}

中序遍历

public static void inOrderIteration(TreeNode root) {
	if (root == null) {
		return;
	}
	TreeNode cur = root;
	Stack<TreeNode> stack = new Stack<>();
	while (!stack.isEmpty() || cur != null) {
		while (cur != null) {
			stack.push(cur);
			cur = cur.left;
		}
		TreeNode node = stack.pop();
		System.out.print(node.value + " ");
		if (node.right != null) {
			cur = node.right;
		}
	}
}

后序遍历

public static void postOrderIteration(TreeNode root) {
		if (root == null) {
			return;
		}
		Stack<TreeNode> stack1 = new Stack<>();
		Stack<TreeNode> stack2 = new Stack<>();
		stack1.push(root);
		while (!stack1.isEmpty()) {
			TreeNode node = stack1.pop();
			stack2.push(node);
			if (node.left != null) {
				stack1.push(node.left);
			}
			if (node.right != null) {
				stack1.push(node.right);
			}
		}
		while (!stack2.isEmpty()) {
			System.out.print(stack2.pop().value + " ");
		}
	}

二叉树的层序遍历(java)

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
    List<List<Integer>> res=new ArrayList();
    public List<List<Integer>> levelOrder(TreeNode root) {
       if(root==null)return res;                                //边界条件
       
        Queue<TreeNode> q=new LinkedList();             //创建的队列用来存放结点,泛型注意是TreeNode
        q.add(root);                                
        while(!q.isEmpty()){                        //队列为空说明已经遍历完所有元素,while语句用于循环每一个层次
            int count=q.size();     
             List<Integer> list=new ArrayList();
            while(count>0){                             //遍历当前层次的每一个结点,每一层次的Count代表了当前层次的结点数目
                TreeNode temp=q.peek();
                q.poll();                                        //遍历的每一个结点都需要将其弹出
                list.add(temp.val);
                if(temp.left!=null)q.add(temp.left);      //迭代操作,向左探索
                if(temp.right!=null)q.add(temp.right);
                count--;
            }
            res.add(list);
        }
        return res;
   
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值