叶子结点

数据结构——关于任一二叉树n0=n2+1的证明

只愿长相守 提交于 2019-12-12 01:39:31
对于任一二叉树,若度为2的结点有n2个,则叶子结点数必为n2+1 证明: 假设该二叉树总共有n个结点(n=n0+n1+n2),则该二叉树总共会有n-1条边,度为2的结点会延伸出两条边, 同理,度为1的结点会延伸出一条边,则可列公式:n-1 = 2*n2 + 1*n1 , 合并两个式子可得:2*n2 + 1*n1 +1 =n0 + n1 + n2 ,则计算可知 n0=n2+1。 来源: https://www.cnblogs.com/Wang-Jack/p/12026777.html

二叉树基本概念

こ雲淡風輕ζ 提交于 2019-12-11 17:53:15
二叉树的理解 ### 五种形态 1.空二叉树 2.仅有根节点的二叉树 3.右子树为空的二叉树 4.左子树为空的二叉树 5.左右子树都是非空的二叉树 ### 二叉树的术语 节点 度 叶子 双亲 兄弟 孩子 子孙 有序树 无序树 ### 二叉树的五种性质 1.二叉树的第i层至多又2^(i-1)个结点 2.深度为K的二叉树至多有2^k-1个结点 3.对任何的一棵二叉树,终端节点数为n0,度为2的结点数为n2,则 n0=n2+1 4.具有n个结点的完全二叉树的深度为[log2(n)]+1 5.如果对一棵有n个结点的完全二叉树的结点按层序编号(从第一层开始,从低到高,从左到右),则对任一结点有 a.如果i=1,则结点i是二叉树的根,无双亲,双亲结点[i/2] b.如果2i>n,则结点i无左孩子;否则其左孩子的结点是2i(NULL) c.如果2i+1>n,则结点i无右孩子 来源: CSDN 作者: 旺财的二哈 链接: https://blog.csdn.net/weixin_45764240/article/details/103484226

树上dp的入门知识

瘦欲@ 提交于 2019-12-11 02:11:47
树的最大独立集 定义:对于一颗n个结点的无根树(没有确定根的树),选出尽量多的结点,使得任意二个结点均不相邻(称为 树的最大独立集 )。 思路:我们可以任意选一个点作为根结点,然后建树。 用d(i)表示以i为根结点的子树的最大独立集大小。 对于结点i,只有两种选择,选或者不选,若选,则问题转化为求出i的孙子的d值之,若不选则转化为求i的儿子的d值之和。 状态转移方程:d(i) = max(1 + gs[i], s[i]); 代码: # include <bits/stdc++.h> using namespace std ; const int mx = 1e5 + 10 ; vector < int > v [ maxn ] ; int d [ maxn ] , s [ maxn ] , gs [ maxn ] , n ; int dfs ( int u , int pre ) { for ( int i = 0 ; i < v [ u ] . size ( ) ; i ++ ) { int m = v [ u ] [ i ] ; if ( m != pre ) dfs ( m , u ) ; s [ u ] + = d [ m ] ; if ( pre != - 1 ) gs [ pre ] + = d [ m ] ; } d [ u ] = max ( s [ u ] ,

第11章 优先队列

拈花ヽ惹草 提交于 2019-12-10 19:04:19
优先队列的定义 优先队列也是一个以集合为基础的抽象数据类型 优先队列中的每一个元素都有一个优先级值。优先队列中元素x的优先级值记为p(x),它可以是一个实数,也可以是一个一般的全序集中的元素。优先级值用来表示该元素出列的优先级。 约定优先级值小的优先级高。亦可约定优先级值大的优先级高。 优先队列支持的基本运算有: (1)Min(H):返回优先队列H中具有最小优先级的元素。 (2)Insert(x, H):将元素x插入优先队列H。 (3)DeleteMin(H):删除并返回优先队列H中具有最小优先级的元素。 优先级树的概念 优先级树是满足下面的优先级性质的二叉树: (1)树中每一结点存储一个元素。 (2)任一结点中存储的元素的优先级值不大(小)于其儿子结点中存储的元素的优先级值即父结点的优先级不低于其儿子结点的优先级。 换句话说,越接近根的结点中的元素的优先级越高,越方便被访问,因为根最方便被访问。 相应的优先级树称为极小(大)化优先级树。 引入堆的概念并用堆来实现优先队列。 (1)堆的概念:如果一棵优先级树是一棵近似满二叉树,那么,这棵具有优先级性质的近似满二叉树(外形像堆)就叫做堆。 (2)用堆实现优先队列:Min(H)、Insert(x, H)和DeleteMin(H)运算的实现 用数组表示堆从而实现优先队列 (1) 用数组表示堆: 从1开始对堆的结点从根开始自上而下逐层

二叉树

你。 提交于 2019-12-10 17:38:16
二叉树代码 二叉树: //先序遍历 void PreOrder(BTNode *t) { if(!t) return; printf("%d ", t->element); PreOrder(t->lChild); PreOrder(t->rChild); } void PreOrderTree(BinaryTree *tree) { if(!tree) return; PreOrder(tree->root); } //求二叉树的高度 int Height(BTNode *t) { if(!t) return 0; int l=Height(t->lChild); int r=Height(t->rChild); if(l>r) return l+1; else return r+1; } //求二叉树中所有节点的数量 void CountNodes(BTNode *t,int *count) { if(!t) return; *count++; CountNodes(t->lChild, count); CountNodes(t->rChild, count); } int CountN(BinaryTree *tree) { if(!tree) return 0; int count=0; CountNodes(tree->root, &count); return

剑指offer-18 二叉树的镜像 -- Java实现

隐身守侯 提交于 2019-12-10 06:33:50
题目 操作给定的二叉树,将其变换为源二叉树的镜像。 分析 思路一: 采用前序遍历的方式,递归实现,在遍历的同时交换非叶子结点的左右子结点(子树)。 代码采用递归实现: 递归头(递归结束的标志) :遍历到叶子结点。 递归体(执行递归的条件) :遍历到的结点非空。 递归内容 :交换左右子结点。 时间复杂度 :o(N) 空间复杂度 :o(N) 代码: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public void Mirror ( TreeNode root ) { //输入结点root为null if ( root == null ) return ; //如果当前结点为叶结点则不执行镜像操作 if ( root . left == null && root . right == null ) return ; //交换结点 TreeNode tmp = root . left ; root . left = root . right ; root . right = tmp ; //递归交换其两子树。 if

LeetCode-在二叉树中分配硬币-979--dfs

拟墨画扇 提交于 2019-12-09 20:30:35
给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。 在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。 返回使每个结点上只有一枚硬币所需的移动次数。 示例 1: 输入:[3,0,0] 输出:2 解释:从树的根结点开始,我们将一枚硬币移到它的左子结点上,一枚硬币移到它的右子结点上。 示例 2: 输入:[0,3,0] 输出:3 解释:从根结点的左子结点开始,我们将两枚硬币移到根结点上 [移动两次]。然后,我们把一枚硬币从根结点移到右子结点上。 示例 3: 输入:[1,0,2] 输出:2 示例 4: 输入:[1,0,0,null,3] 输出:4 提示: 1<= N <= 100 0 <= node.val <= N 思路: 如果树的叶子仅包含 0 枚金币(与它所需相比,它的 过载量 为 -1),那么我们需要从它的父亲节点移动一枚金币到这个叶子节点上。如果说,一个叶子节点包含 4 枚金币(它的 过载量 为 3), 那么我们需要将这个叶子节点中的 3 枚金币移动到别的地方去。 所以计算一个父节点的负载量,会等于 左子节点的负载量 + 右子节点的负载量 + 父节点的金币数 - 1 而中间需要移动的金币的次数会等于

数据结构-树

梦想与她 提交于 2019-12-09 15:28:41
树以及常用的算法 树的概念 树(Tree)的基本概念树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。 二叉树的概念 每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。二叉树的性质1.若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)2.高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)(空树的高度为-1)3.对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1 二叉树的分类 二叉树又分为:完美二叉树,完全二叉树,完满二叉树 其中完满二叉树:除了叶子节点每个节点都有俩个孩子 完全二叉树:除了最后一层外,除了叶子节点每个节点都有俩个孩子 完美二叉树:除了叶子节点外,每一层每个节点都有俩个孩子 完美二叉树 完全二叉树 完满二叉树 完满二叉树 来源: https://www.cnblogs.com/xiaoshahai/p/12010661.html

go语言实现--二叉树

佐手、 提交于 2019-12-08 04:22:41
二叉树 是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树 的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有 2^{i-1} 个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1(百度百科)。 二叉树有多种: (1)完全二叉树 ——叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树。 (2)满二叉树 ——叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫作满二叉树,他是一种特殊的完全二叉树。 (3)平衡二叉树 ——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 一般二叉树性质: 性质1:二叉树第i层上的结点数目最多为 2^{i-1} (i≥1)。 性质2:深度为k的二叉树至多有2^{k}-1个结点(k≥1)。 性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。 性质4

数据结构代码集锦3

╄→尐↘猪︶ㄣ 提交于 2019-12-07 23:45:34
#include<stdio.h> #include<math.h> int Bdepth(BiTree b) { //求二叉树的高度 int ldepth,rdepth; if(b==NULL) return 0; ldepth = Bdepth(b->lchild); rdepth = Bdepth(b->rchild); return (ldepth>rdepth)?(ldepth+1):(rdepth+1); } int Bignodes(BiTree b,Elemtype x) {//求二叉树b中所有大于x结点的值的个数 int num1,num2,num=0; if(b==NULL) return 0; num1 = Bignodes(b->lchild,x); num2 = Bignodes(p->rchild,x); num += num1+num2; if(b->data>x) //if(b->data<x)变成求小于x结点值的个数 num++; return num; } /*统计二叉树中第k层结点的个数 思想:采用先序遍历的递归算法,num初值为0,若当前访问结点b是第k层上的叶子节点 则num++,再求出左右子树第k层上的叶子节点个数num1,num2,最后返回num1+num2*/ int Lnodes(BiTree b,int h,int k,int n