二叉树的一些基本操作 |刷题打卡

752 阅读2分钟

1、定义一个二叉树的节点类,如下所示:

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

2、定义一个Tree类,并将root结点定义为null

class Tree{
    constructor() {
        this.root = null;
    }
}

3、二叉树的插入操作

    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的下一层。

4、二叉树的递归遍历

    //前序遍历,传入的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();
        }
    }

5、获取二叉树的最大值和最小值

    //获取二叉树的最小值
    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。继续循环。

获取最大值和获取最小值的方法差不多,就是一直遍历二叉树的右节点。

6、获取二叉树的高度

    //获取二叉树的的高度
    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的左右节点。

最后返回左高度和右高度中较大的那个。

7、树查找

    //树查找
    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。继续循环。关于针对二叉树的具体的题目,下次再写。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情