使用JS实现二叉树相关算法

1. 如何遍历一个二叉树

思路: 创建一个队列,通过队列的进出实现对二叉树所有节点的遍历
实现代码如下:

function traverseNode(q){
	var queue = []
	queue.push(q)
	while(queue.length != 0){
		var node = queue.pop()
		console.log('value ==========> ', node.val)
		if(node.left) queue.push(node.left)
		if(node.right) queue.push(node.right)
	}
}

2.对比两个二叉树是否相同

大致思路:利用递归实现二叉树的深度搜索对比
实现代码:

// 写法一
var isSameTree = function(p, q) {
    // 使用递归方法
    if(p == null && q == null ) return true
    if(p == null || q == null ) return false
    if(p.val != q.val) return false
    let leftp = p.left
    let leftq = q.left
    if(!isSameTree(leftp, leftq)) {
        return false
    }

    let rightp = p.right
    let rightq = q.right
    if(!isSameTree(rightp, rightq)) {
        return false
    }
    return true
};

// 写法二
function isSameTree(p, q){
	function sameNodes(t1, t2){
		if(t1 == null && t2 == null) return false
		if(t1 == null || t2 == null) return true
		return (t1.val == t2.val) && sameNodes(t1.left, t2.left) && sameNodes(t1.right, t2.right)
	}
	return sameNodes(p, q)
}
3. 二叉树的中序遍历—给定一个二叉树的根节点 root ,返回它的 中序 遍历

大致思路: 同样要使用遍历的思想去实现
实现代码:

var inorderTraversal = function(root) {
    var arr = []
    function inorderNode(node){
        if(!node) return 
        inorderNode(node.left)
        arr.push(node.val)
        inorderNode(node.right)
    }
    inorderNode(root)
    return arr
};
4. 对称二叉树 – 判断一个二叉树是否为镜像二叉树

大致思路:可参考对比两个二叉树是否为相同的二叉树算法
实现代码:

var isSymmetric = function(root) {
	// 注释的部分代码可过绝不部分测试用例,但是[1,2,2,2,null,2]始终过不去,不明觉厉
    // var arr = []
    // function travseNode(node){
    //     if(!node) return node
    //     travseNode(node.left)
    //     arr.push(node.val)
    //     travseNode(node.right)
    // }
    // travseNode(root)
    // let len = arr.length
    // if(len % 2 == 0 ) return false
    // if(len <=1 ) return true
    // var m = Math.floor(len / 2) 
    // for(let i = 0; i < m; i++){
    //     if(arr[i] != arr[len - i - 1]) {
    //         return false
    //     }
    // }
    // return true
    function sameNodes(t1, t2) {
         if(t1==null&&t2==null){
            return true;
        }
        if(t1==null||t2==null){
            return false;
        }
        return (t1.val==t2.val) && sameNodes(t1.right,t2.left) && sameNodes(t2.left,t1.right);
    }
    return sameNodes(root, root)
};
5.翻转二叉树

大致思路:首先翻转根节点,然后使用递归去翻转它的左右节点
实现代码:

var invertTree = function(root) {
    function invertNode(root){
        if(!root) return
        if(root.left || root.right) {
            var left  = root.left
            var right = root.right
            root.left = right
            root.right = left
            if(root.left) invertNode(root.left)
            if(root.right) invertNode(root.right)
        }
    }
    invertNode(root)
    return root
};
总结:以上仅供自己及二叉树初学者参考学习,如有错误,请帮忙指出,后续会持续更新
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值