美文网首页
数据结构-二叉搜索树-javascript

数据结构-二叉搜索树-javascript

作者: 小麻烦爱学习 | 来源:发表于2020-07-15 14:30 被阅读0次

深度非递归遍历(前序/中序/后序)
层序遍历

class Node{
    constructor(element, parent){
        this.element = element;
        this.parent = parent;
        this.left = null;
        this.right = null;
    }
}

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

    insert(index, element){
        if(element === undefined){
            element = index;
            index = this.size;
        }
        if(index < 0 || index > this.size) throw new Error('index is out of boundary');
        if(this.root === null){
            this.root = new Node(element, null);
            this.size++;
            return;
        }
        let current = this.root;
        
        while(current){
            let compare = current.element - element;
            if(compare > 0){
                if(!current.left){
                    this.size ++;
                    current.left = new Node(element, current);
                    return;
                }else{
                    current = current.left;
                }
                
            }else if(compare < 0){
                if(!current.right){
                    this.size ++;
                    current.right = new Node(element, current);
                    return;
                }else{
                    current = current.right;
                }
            } else if(compare === 0){
                return;
            }
        }
    }

    preorder(){
        // 根节点入栈
        // 根节点出栈
        // 根节点的右节点入栈
        // 根节点的左节点入栈
        // 左节点出栈
        let stack = [this.root];
        let current;
        while(stack && (current=stack.pop())) {
            console.log(current.element);
            if(current.right){
                stack.push(current.right);
            }
            if(current.left){
                stack.push(current.left);
            }
        }
    }

    inorder(){
        // 根节点入栈
        // 根节点的左节点入栈
        // 如果左节点还有左子节点,继续入栈;没有左子节点,出栈,右子节点入栈
        let stack = [this.root];
        let current = this.root;
        while(current && stack.length > 0){
            if(current.left){
                stack.push(current = current.left);
            }else{ //没有左子节点,那么要出栈,当前节点的右子节点入栈
                current = stack.pop();
                console.log(current.element);
                if(current.right){
                    stack.push(current = current.right);
                }
            }
        }
    }

    postorder(){
        // 入栈 
        // 指针指向入栈节点的左节点
        // 取栈 出栈
        let stack=[];
        let stackCount=[];
        let index = -1;
        let current = this.root;
        while(current || index > -1){
            if(current){// 入栈
                stack[++index] = current;
                stackCount[index] = 1;
                current = stack[index].left;
            }else{ // 指针指向节点为null,看栈顶元素是否可以取栈
                if(stackCount[index] === 1){
                    // 取栈
                    stackCount[index] = 2;
                    // 取出栈顶元素的右子节点
                    current = stack[index].right;
                }else{ // 指针指向null,栈顶元素已经读取过,符合出栈条件
                    // 出栈
                    let temp = stack[index--];
                    console.log(temp.element);
                    current = null; // 指针置为null,下一个循环取栈或者出栈
                }
            }
        }  
    }

    levelTraverse(){
        if(!this.root) return;
        let stack = [this.root];
        let index = 0;
        let current;
        while(current = stack[index++]){
            console.log(current.element);
            if(current.left){
                stack.push(current.left);
            }
            if(current.right){
                stack.push(current.right);
            }
        }

    }
}

let arr = [10,8,19,6,15,22,20];
let tree = new Tree();
arr.forEach(item => {
    tree.insert(item);
});

// console.dir(tree,{depth:100});
console.log('pre',10,8,6,19,15,22,20);
tree.preorder();
console.log('in',6,8,10,15,19,20,22);
tree.inorder();
console.log('post',6,8,15,20,22,19,10);
tree.postorder();
console.log('level',10,8,19,6,15,22,20);
tree.levelTraverse();

相关文章

  • Go语言数据结构和算法-BinarySearchTree(二叉搜

    Go语言数据结构和算法-BinarySearchTree(二叉搜索树) 二叉搜索树的数据结构 Insert(val...

  • LeetCode 1038.从二叉搜索树到更大和树

    ?博客原文 :《LeetCode 1038.从二叉搜索树到更大和树 - JavaScript》 给出二叉搜索树的根...

  • 数据结构-二叉搜索树

    数据结构-二叉搜索树(BST) 定义:二叉搜索树是一个节点类的二叉树数据结构,包含以下特点: -左子树仅包含比根节...

  • 关于函数递归和迭代的转化, 及尾递归相关知识的接触和思考

    javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作 js 二叉树 【数据结构与算法】深入浅出递...

  • 二叉搜索树

    前言 最近复习了一下数据结构,学到二叉搜索树的时候有一些感触,记录下来。 编程语言:JavaScript内容:二叉...

  • 二叉搜索树与双向链表[待加深]

    2018/11/4?环境:牛客的编译环境?语言:JavaScript☕️难点: 二叉搜索树的概念:二叉搜索树也叫二...

  • 二叉树

    参考文章 百度 数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见...

  • Day3--搜索树

    在二叉判定树以及二分搜索的基础上,基于二叉树的搜索树产生,该数据结构可以随时进行调整,可以保证高效的搜索效率。 内...

  • 【学习】数据结构和算法

    数据结构 线性表:数组 栈 队列 链表树:二叉树 二叉树遍历 二叉搜索树 B树 红黑树 堆图:图其他:哈希表...

  • Go:实现二叉搜索树(BST)

    二叉搜索树是一种支持快速查找、增加和删除元素的数据结构。二叉搜索树中的节点是有序的,因此支持快速查找。该数据结构由...

网友评论

      本文标题:数据结构-二叉搜索树-javascript

      本文链接:https://www.haomeiwen.com/subject/gmkncktx.html