数据结构之二叉树遍历

二叉树的存储

二叉树的存储方式分为顺序存储链式存储
二叉树的链式存储是通过一个个节点引用起来的,常见的表示方式二叉表示法和三叉表示法。

//孩子表示法 (二叉)
class Node{
	int value;   //数据域
	Node left;   //左孩子  即左孩子为根的左子树
	Node right;  //右孩子  即右孩子为根的右子树
}

//孩子双亲表示法 (三叉)
class Node{
	int value;   //数据域
	Node left;   //左孩子  即左孩子为根的左子树
	Node right;  //右孩子  即右孩子为根的右子树
	Node parent; //当前节点的根结点
}

在这里插入图片描述

在这里插入图片描述

二叉树的基本操作

二叉树的遍历

遍历:指沿着某条搜索路线,一次对树上每个节点均做一次且只做一次访问。
根据遍历根节点的前后顺序分为三种遍历方式:前序遍历中序遍历后序遍历

  • 前序遍历(先序遍历):Preorder Traversal
    先访问根结点 —》访问根的左子树 —》访问根的右子树

  • 中序遍历:Inorder Traversal
    先访问根的左子树 —》访问根节点 —》访问根的右子树

  • 后序遍历:Postorder Traversal
    先访问根的左子树 —》访问根的右子树 —》访问根节点
    在这里插入图片描述

二叉树的基本操作

二叉树的基本操作多是利用递归实现.

遍历结果直接打印代码实现:


class Node{
	public char value;   //数据域
	public Node left;   //左孩子  即左孩子为根的左子树
	public Node right; 
	public Node(char value){
        this.value = value;
    }
}
public class BinaryTree{
	//建立一个二叉树
	public Node BuildTree(){
        Node A = new Node('A');
        Node B = new Node('B');
        Node C = new Node('C');
        Node D = new Node('D');
        Node E = new Node('E');
        Node F = new Node('F');
        Node G = new Node('G');
        Node H = new Node('H');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.right = H;
        C.left = F;
        C.right = G;
        return A;
    }
	//前序遍历(根左右)
	/*
	*如果根结点不为空,先打印根结点,再遍历左子树,最后遍历右子树
	*/
	public void preOrderTraversal(Node root){
        if (root == null){
            return;
        }
        System.out.print(root.value + " ");
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);

    }
    //中序遍历(左根右)
    void inOrderTraversal(Node root){
        if (root ==null){
            return;
        }
        inOrderTraversal(root.left);
        System.out.print(root.value + " ");
        inOrderTraversal(root.right);
    }
	//后序遍历(左右根)
	 public void postOrderTraversal(Node root){
        if (root == null){
            return;
        }
        postOrderTraversal(root.left);
        postOrderTraversal(root.right);
        System.out.print(root.value + " ");
    }
 }

遍历结果放在一个list链表中,返回链表。
代码实现:

class Node{
    public char value;   //数据域
    public Node left;   //左子树
    public Node right;  //右子树

    public Node(char value){
        this.value = value;
    }
}

public class BinaryTree {
    public Node BuildTree(){
        Node A = new Node('A');
        Node B = new Node('B');
        Node C = new Node('C');
        Node D = new Node('D');
        Node E = new Node('E');
        Node F = new Node('F');
        Node G = new Node('G');
        Node H = new Node('H');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.right = H;
        C.left = F;
        C.right = G;
        return A;
    }

    // 前序遍历   递归实现
    public List<Character> preorderTraversal(Node root) {
        List<Character> list = new ArrayList<>();
        if (root == null){
            return list;
        }
        list.add(root.value);
        List<Character> left = preorderTraversal(root.left);
        list.addAll(left);
        List<Character> right = preorderTraversal(root.right);
        list.addAll(right);
        return list;
    }
    
    // 中序遍历
    public List<Character> inorderTraversal(Node root) {
        if (root == null){
            return list;
        }
        List<Character> left = inorderTraversal(root.left);
        list.addAll(left);
        list.add(root.value);
        List<Character> right = inorderTraversal(root.right);
        list.addAll(right);
        return list;
    }

    // 后序遍历
    public List<Character> postorderTraversal(Node root) {
        if (root == null){
            return list;  //打印[]
        }
        List<Character> left = postorderTraversal(root.left);
        list.addAll(left);
        List<Character> right = postorderTraversal(root.right);
        list.addAll(right);
        list.add(root.value);
        return list;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值