赞
踩
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
不需要特殊记忆概念:
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。
列如 :
孩子兄弟表示法 :
class Node {
int value; // 树中存储的数据
Node firstChild; // 第一个孩子引用
Node nextBrother; // 下一个兄弟引用
}
一棵二叉树是结点的一个有限集合,该集合:
注意:对于任意的二叉树都是由以下几种情况复合而成的:
某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为(200 ) // n0=n2+1
A 不存在这样的二叉树
B 200
C 198
D 199
在具有 2n 个结点的完全二叉树中,叶子结点个数为( n)
A n
B n+1
C n-1
D n/2
// 2n一定是偶数,所以n1一定是1个 n0 n2不一定
所以 :(n0=n2+1) 叶子节点即为n0 解出x即可 :
相同地,对于奇数几点有 :
一个具有767个节点的完全二叉树,其叶子节点个数为(384)
A 383
B 384
C 385
D 386
//767是奇数,n1一定是0
n0=n2+1
有767=n0+n2=n0+n0-1====> n0(叶子节点)=384
一棵完全二叉树的节点数为531个,那么这棵树的高度为(10 )
A 11
B 10
C 8
D 12
//log2(n+1) 向上取整:
k=log2 534
2^9=512
531
2^10=1024
根据向上取整,得k=10
二叉树的存储结构分为:顺序存储和类似于链表的链式存储。
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,具体如下:
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
核心思想 : 二叉树定义是递归式的
有关二叉树三种遍历方式OJ题如下 :
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<Integer> list=new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if(root==null) return list; list.add(root.val); preorderTraversal(root.left); preorderTraversal(root.right); return list; } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<Integer> list=new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if(root==null) return list; inorderTraversal(root.left); list.add(root.val); inorderTraversal(root.right); return list; } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<Integer> list=new ArrayList<>(); public List<Integer> postorderTraversal(TreeNode root) { if(root==null) return list; postorderTraversal(root.left); postorderTraversal(root.right); list.add(root.val); return list; } }
画图举列如下:
层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
//根据题意 完全二叉树 以及层次序列 ,可以推导二叉树图形如下 :
注意 : 只根据二叉树的某一个遍历,是不能完全确定一颗二叉树的
根据给出的先序遍历可以知道祖先根为E
根据中序遍历可以知道 : HFI(左子树) E(根) JKG(右子树)
最后可以推导出二叉树为:
方法如下
根据后续遍历可以知道二叉树的祖先根为a
根据中序遍历 : b(左子树) a (祖先根) dce(右子树)
最后可以推导出二叉树为:
注意:如果给出的是前序遍历和后序遍历,是不能得到一颗确切的二叉树的,因为此时拿到的都是根,必须需要得到中序遍历,再搭配二者其一,才能确定一颗确切的二叉树 !
根据以上方法,分析题意,得到的二叉树如下:
gitee链接点此跳转
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。