详细可看这篇文章:https://www.cnblogs.com/cangqinglang/p/11307369.html
递归遍历二叉树demo:
var tree = {
"id": 0,
"name": "root",
"left": {
"id": 1,
"name": "Simon",
"left": {
"id": 3,
"name": "Carl",
"left": {
"id": 7,
"name": "Lee",
"left": {
"id": 11,
"name": "Fate"
}
},
"right": {
"id": 8,
"name": "Annie",
"left": {
"id": 12,
"name": "Saber"
}
}
},
"right": {
"id": 4,
"name": "Tony",
"left": {
"id": 9,
"name": "Candy"
}
}
},
"right": {
"id": 2,
"name": "right",
"left": {
"id": 5,
"name": "Carl",
},
"right": {
"id": 6,
"name": "Carl",
"right": {
"id": 10,
"name": "Kai"
}
}
}
}
// 把这个对象中所有的名字以“前序遍历”的方式全部输出到console中
function getListWithDLR(obj) {
console.log(obj.id);
if(obj.left){
getListWithDLR(obj.left);
}
if(obj.right){
getListWithDLR(obj.right);
}
}
console.log("前序遍历:");
getListWithDLR(tree);
// 把这个对象中所有的名字以“中序遍历”的方式全部输出到console中
function getListWithLDR(obj) {
if(obj.left){
getListWithLDR(obj.left);
}
console.log(obj.id);
if(obj.right){
getListWithLDR(obj.right);
}
}
console.log("中序遍历:");
getListWithLDR(tree);
// 把这个对象中所有的名字以“后序遍历”的方式全部输出到console中
function getListWithLRD(obj) {
if(obj.left){
getListWithLRD(obj.left);
}
if(obj.right){
getListWithLRD(obj.right);
}
console.log(obj.id);
}
console.log("后序遍历:");
getListWithLRD(tree);
判断二叉树是否对称:
对称二叉树:
非对称二叉树:
实现思路:
- 判断根节点相同
- 左子树的右节点和右子树的左节点相同
- 右子树的左节点和左子树的右节点相同
var isSymmetric = function(root) {
if(root == null){
return true;
}
return isSym(root.left,root.right)
};
function isSym(left,right){
if(!left && !right) {//判断两个节点都是否为空
return true;
}
if(!left || !right){//判断两个节点是否存在一个为空
return false;
}
if(left.val != right.val){//判断两个节点是否相同
return false;
}
//callee返回正在执行的函数本身的引用
return arguments.callee(left.left,right.right) && arguments.callee(left.right,right.left);
}