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
};