算法_001_二叉树(1)(关于二叉树的一些总结),配实践代码

1,深度为k的完全二叉树中最少有2k-1个节点。

        关于完全二叉树:只有下面两层节点的可以小于2,并且最下层的叶节点集中在靠左的若干位置上(注(基本术语)

                度:结点拥有的子树的个数;

               叶节点:也叫终端结点,是度为 0 的结点;

                结点层:根结点的层定义为第一层,根的孩子为第二层,依此类推;

                树的深度:树中最大的结点层;

                结点的度:结点拥有的子树的个数;

                树的度: 树中最大的结点度;

                分枝结点:度不为0的结点

        关于满级二叉树:满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树;一棵完全二叉树,其某结点如果没有左孩子就一定不能有右孩子,且某结点没有左孩子或右孩子则它后面就不能有孩子( 一棵满二叉树必定是一棵完全二叉树,而完全二叉树不一定是满二叉树)

        关于平衡二叉树:是一棵空树,或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

  • 在二叉树的第 i 层上最多有2^(i-1)个结点(i>=1)
  • 深度为h的二叉树,最多有2^h-1个结点,最少有h个结点(h>=1)
  • 包含n个结点的二叉树的高度至少为(log2n)+1
  • 在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

2,二叉树遍历----------前(先)序遍历【根(中)左右】,中序遍历【左根(中)右】,后序遍历【左右根(中)】;深度优先算法;

定义二叉树:

   //二叉树的定义
function TreeNode(val, left, right) {
	this.val = (val === undefined ? 0 : val);
    this.left = (left === undefined ? null : left);
    this.right = (right === undefined ? null :right);
}

创建二叉树(树图),还有其他的构建方式,因此方法更便于理解,故作展示:

let biTree = new TreeNode("A");
biTree.left = new TreeNode("B");
biTree.left.left = new TreeNode("D");
biTree.left.left.left = new TreeNode('H');
biTree.left.left.right = new TreeNode("I")
biTree.left.right = new TreeNode("E");
biTree.left.right.right = new TreeNode('G')
biTree.right = new TreeNode('C');
biTree.right.left = new TreeNode('F');
biTree.right.left.left = new TreeNode("K");
biTree.right.left.right = new TreeNode("L");
biTree.right.left.right.left = new TreeNode("M");
biTree.right.left.right.right = new TreeNode("N");
biTree.right.right = new TreeNode('G');
biTree.right.right.right = new TreeNode('O');

 前(先)序遍历【根(中)左右】:

//二叉树的前序遍历 中左右 
var preorderTraversal = function(root) { //传入根节点
    let res = [];//返回遍历二叉树的数组
    const dfs = function(root) {
    	if(root === null) return;
        res.push(root.val);//中
        dfs(root.left);//遍历左子树,直到叶子节点 逐层返回
        dfs(root.right);//遍历右子树,直到叶子节点 逐层返回
    }
    dfs(root);//只使用一个参数,使用闭包进行储存结果
    return res;
};

中序遍历【左根(中)右】:

//二叉树的中序遍历 左中右 与前序遍历相同,位置换一下
var inorderTraversal = function(root) {
  let res = [];
    const dfs = function(root) {
		if(root === null) return;
        dfs(root.left);
        res.push(root.val);
        dfs(root.right);
    }
    dfs(root);
    return res;
};

序遍历【左右根(中)】:

//二叉树的后序遍历 左右中
var postorderTraversal = function(root) {
    let res = [];
    const dfs = function(root) {
		if(root === null) return;
        dfs(root.left);
        dfs(root.right);
        res.push(root.val);
    }
    dfs(root);
    console.log(res);//打印看结果
    return res;
}
postorderTraversal(biTree)

层序遍历:

引申“队列

function levelOrder(root)
{
    var queue = [], res = [];
    queue.push(root);
    while(queue.length != 0){
        let len = queue.length;  //一层结点个数
        let temp = [];
        for(let i = 0; i < len; i++){
            var node = queue.shift();//shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
            temp.push(node.val);
            if(node.left)
                queue.push(node.left);
            if(node.right)
                queue.push(node.right);
        }
        res.push(temp);
    }
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值