每天一个算法之二叉树

78 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

二叉树

二叉树是一种数据结构,为什么是树呢?如何实现?可以解决什么问题?如何应用到实际案例当中?请往后看。

简介

(tree)是一种数据类型,一般树状的数据集合就可以用“树”来表示,什么是树状的数据集合呢,就是自上而下有层级关系的集合,上小下大,欻一下的散开跟树很像,可以由n个节点通过“边”连接起来。

二叉树则是有限节点的集合,也可以是空集。每个节点上最多两个子节点,并且左侧子节点的值肯定小于父节点的值,右侧子节点的值肯定大于父节点的值。左右两节点不会相交,各自有自己的左子节点和右子节点,你可能不知道,二叉树也有递归的概念,最近递归接触的有点多呀。

二叉树实现

上面刚说到二叉树也用到了递归的思想,是因为它的每个节点最多有两个子节点,每个子节点又最多有两个子子节点,也就相当于两个二叉树,因此可以用递归思想实现二叉树。

public class BinaryTreeNode {
    
    private int data;  
    private BinaryTreeNode leftChirld;  
    private BinaryTreeNode rightChirld; 
    
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public BinaryTreeNode getLeftChirld() {
        return leftChirld;
    }
    public void setLeftChirld(BinaryTreeNode leftChirld) {
        this.leftChirld = leftChirld;
    }
    public BinaryTreeNode getRightChirld() {
        return rightChirld;
    }
    public void setRightChirld(BinaryTreeNode rightChirld) {
        this.rightChirld = rightChirld;
    }        
}

二叉树遍历

二叉树的遍历是按照一定的规律来顺序遍历各二叉树的节点,对每一个节点都是访问有且仅有一次,一般通过递归思想区访问。二叉树根据对根节点先后先后顺序的遍历可分为:先根遍历、中根遍历、后根遍历。

/***
中根遍历
遍历左侧节点
访问根节点
遍历右侧节点
***/
public void infixTest(Node node){
    if(node != null){
        infixTest(node.leftChild);
        System.out.print(node.data);
        infixTest(node.rightChild);
    }
}
 
/***
先根遍历
先访问根节点
遍历左侧节点
遍历右侧节点
***/
public void preTest(Node node){
    if(node != null){
        System.out.print(node.data);
        preTest(node.leftChild);
        preTest(node.rightChild);
    }
}
 
/***
后根遍历
先遍历左侧树
遍历右侧节点
访问根节点
***/
public void postTest(Node node){
    if(node != null){
        postTest(node.leftChild);
        postTest(node.rightChild);
        System.out.print(node.data); 
    }
}

\