JS实现二叉树的创建和遍历&&判断二叉树是否对称

详细可看这篇文章: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);

判断二叉树是否对称:

对称二叉树:
在这里插入图片描述
非对称二叉树:
在这里插入图片描述

实现思路:

  1. 判断根节点相同
  2. 左子树的右节点和右子树的左节点相同
  3. 右子树的左节点和左子树的右节点相同
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);
}
发布了68 篇原创文章 · 获赞 32 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Web_J/article/details/103239191
今日推荐