二叉樹的一些基本操做 |刷題打卡

一、定義一個二叉樹的節點類,以下所示:

class Node {
    constructor(data, left, right) {
        this.data = data;
        this.left = left;
        this.right = right
    }
    show() {
        console.log(this.data);
    }
};
複製代碼

二、定義一個Tree類,並將root結點定義爲null

class Tree{
    constructor() {
        this.root = null;
    }
}
複製代碼

三、二叉樹的插入操做

insert(data) {
        var node = new Node(data,null,null);
        if (!this.root) {
            this.root = node;
            return ;
        }
        var current = this.root;
        var parent = null;
        while (current) {
            //parent 永遠指向子樹的根節點,current是子樹根節點的子節點一個指針。
            parent = current;
            if (data < parent.data) {
                current = current.left;
                if (! current) {
                    parent.left = node;
                    return ;
                }
            } else if( data > parent.data){
                current = current.right;
                if (! current) {
                    parent.right = node;
                }
            } else {
                return ;
            }
        }
    }
複製代碼

首先定義一個node,將要插入的data賦值給node。定義一個parent永遠指向子樹的根節點。而後定義一個current指針,若是data <current.data,current = current.left。current指針每次移動douyao判斷current是否爲空。若是爲空說明找到 了插入的位置,parent.left = node或者parent.right = node。current永遠在parent的下一層。javascript

四、二叉樹的遞歸遍歷

//前序遍歷,傳入的node是根節點
    preOrder(node) {
        if (node) {
            node.show();
            this.preOrder(node.left);
            this.preOrder(node.right);
        }
    }
    //中序遍歷
    middleOrder(node) {
        if (node) {
            this.middleOrder(node.left);
            node.show();
            this.middleOrder(node.right);
        }
    }
    //後序遍歷
    laterOrder(node) {
        if (node) {
            this.laterOrder(node.left);
            this.laterOrder(node.right)
            node.show();
        }
    }
複製代碼

五、獲取二叉樹的最大值和最小值

//獲取二叉樹的最小值
    getMin() {
        var current = this.root;
        while (current) {
            if (! current.left) {
                return current
            }
            current = current.left;
        }
    }
    //獲取二叉樹的最大值
    getMax() {
        var current = this.root;
        while (current) {
            if (! current.right) {
                return current
            }
            current = current.right;
        }
    }
複製代碼

獲取最小值就是一直向左遍歷二叉樹的節點。判斷current.left是否爲空,若是爲空的話說明current就是最小值,返回current,不然將current = current.left。繼續循環。java

獲取最大值和獲取最小值的方法差很少,就是一直遍歷二叉樹的右節點。node

六、獲取二叉樹的高度

//獲取二叉樹的的高度
    getDeep(node,deep) {
        if (deep === undefined) {
            deep = 0
        }
        if (node === null) {
            return deep;
        }
        deep++;
        var dleft = this.getDeep(node.left,deep);
        var dright = this.getDeep(node.right,deep);
        return Math.max(dleft,dright);
    }
複製代碼

分別遞歸二叉樹的左右節點,若是node === null,就返回deep,若是node !==null,deep就加一,而後繼續查找node的左右節點。markdown

最後返回左高度和右高度中較大的那個。oop

七、樹查找

//樹查找
    getNode(data,node) {
        if (node) {
            if (data === node.data) {
                return node;
            }else if(data < node.data) {
                return this.getNode(data,node.left);
            } else {
                return this.getNode(data,node.right);
            }
        } else {
            return null;
        }
    }
複製代碼

總結

關於二叉樹的基本操做,通常都是用一個current指針,若是知足某一個條件,就把current置爲current.left或者current.right。繼續循環。關於針對二叉樹的具體的題目,下次再寫。ui

本文正在參與「掘金 2021 春招闖關活動」, 點擊查看 活動詳情this

相關文章
相關標籤/搜索