单一页面网站怎么做,最专业网站建,阿里云带宽5m能做什么网站,九一果冻制品厂最新电视概念
一棵二叉树是结点的一个有限集合#xff0c;该集合#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
从上图可以看出#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分#xff0c;次序不能颠倒#x…概念
一棵二叉树是结点的一个有限集合该集合 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
从上图可以看出 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分次序不能颠倒因此二叉树是有序树 注意对于任意的二叉树都是由以下几种情况复合而成的
大自然的奇观 两种特殊的二叉树 1. 满二叉树: 如果每层的结点数都达到最大值则这棵二叉树就是满二叉树。也就是说如果一棵 二叉树的层数为K且结点总数是 则它就是满二叉树。
2. 完全二叉树: 从上到下从左到右依次。
要注意的是满二叉树是一种特殊的完全二叉树。
二叉树的性质 3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0n21 度为0的节点会比度为2的节点多一个 5. 对于具有n个结点的完全二叉树如果按照从上至下从左至右的顺序对所有节点从0开始编号则对于序号为i的结点有 若i0双亲序号(i-1)/2i0i为根结点编号否则无双亲结点 若2i1n左孩子序号2i1否则无左孩子 若2i2n右孩子序号2i2否则无右孩子 1. 某二叉树共有 399 个结点其中有 199 个度为 2 的结点则该二叉树中的叶子结点数为 A 不存在这样的二叉树 B 200 C 198 D 199 2.在具有 2n 个结点的完全二叉树中叶子结点个数为 A n B n1 C n-1 D n/2 3.一个具有767个节点的完全二叉树其叶子节点个数为 A 383 B 384 C 385 D 386 4.一棵完全二叉树的节点数为531个那么这棵树的高度为 A 11 B 10 C 8 D 12 答案 1.B 2.A 3.B 4.B 二叉树的存储
二叉树的存储结构分为顺序存储和类似于链表的链式存储。 顺序存储在下节介绍。 二叉树的链式存储是通过一个一个的节点引用起来的常见的表示方式有二叉和三叉表示方式具体如下 // 孩子表示法 class Node { int val; Node left;// 数据域 // 左孩子的引用常常代表左孩子为根的整棵左子树 Node right; // 右孩子的引用常常代表右孩子为根的整棵右子树 } // 孩子双亲表示法 class Node { int val; Node left;// 数据域 // 左孩子的引用常常代表左孩子为根的整棵左子树 Node right; // 右孩子的引用常常代表右孩子为根的整棵右子树 Node parent; // 当前节点的根节点 } 孩子双亲表示法后序在平衡树位置介绍本文采用孩子表示法来构建二叉树。
二叉树的基本操作
二叉树的遍历 下面主要分析前序递归遍历中序与后序图解类似可自己动手绘制。
前序遍历结果1 2 3 4 5 6 中序遍历结果3 2 1 5 4 6 后序遍历结果3 1 5 6 4 1 层序遍历 前置说明
在学习二叉树的基本操作前需先要创建一棵二叉树然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入为了降低大家学习成本此处手动快速创建一棵简单的二叉树快速进入二叉树操作学习等二叉树结构了解的差不多时我们反过头再来研究二叉树真正的创建方式。
public class TestBinaryTree {static class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val val;}}public TreeNode createTree() {TreeNode A new TreeNode(A);TreeNode B new TreeNode(B);TreeNode C new TreeNode(C);TreeNode D new TreeNode(D);TreeNode E new TreeNode(E);TreeNode F new TreeNode(F);TreeNode G new TreeNode(G);TreeNode H new TreeNode(H);A.left B;A.right C;B.left D;B.right E;C.left F;C.right G;E.right H;return A;}// 前序遍历void preOrder(TreeNode root) {if (root null) {return;}System.out.print(root.val );//递归遍历左子树preOrder(root.left);//递归遍历右子树preOrder(root.right);}// 中序遍历void inOrder(TreeNode root) {if (root null) {return;}inOrder(root.left);System.out.print(root.val );inOrder(root.right);}// 后序遍历void postOrder(TreeNode root) {if (root null) {return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val );}}public class Test {public static void main(String[] args) {TestBinaryTree testBinaryTreenew TestBinaryTree();TestBinaryTree.TreeNode roottestBinaryTree.createTree();testBinaryTree.preOrder(root);System.out.println();testBinaryTree.inOrder(root);System.out.println();testBinaryTree.postOrder(root);System.out.println();}
}注意上述代码并不是创建二叉树的方式真正创建二叉树方式后序详解重点讲解。 1.某完全二叉树按层次输出同一层从左到右的序列为 ABCDEFGH 。该完全二叉树的前序序列为() A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA 2.二叉树的先序遍历和中序遍历如下先序遍历EFHIGJK;中序遍历HFIEJKG.则二叉树根结点为() A: E B: F C: G D: H 上难度画出这棵树 并且求出后序遍历 3.设一课二叉树的中序遍历序列badce后序遍历序列bdeca则二叉树前序遍历序列为() A: adbce B: decab C: debac D: abcde 4.某二叉树的后序遍历序列与中序遍历序列相同均为 ABCDEF 则按层次输出(同一层从左到右)的序列为() A: FEDCBA B: CBAFED C: DEFCBA D: ABCDEF 【参考答案】 1.A 2.A 3.D 4.A 二叉树的基本操作 //子问题思路//获取树中节点的个数(左子树节点个数右子树节点个数1整棵树的节点个数public int size(TreeNode root) {if (root null) {return 0;}int ret size(root.left) size(root.right) 1;return ret;}public static int nodeSize;//遍历思路public void size2(TreeNode root) {if (root null) {return;}nodeSize;size2(root.left);size2(root.right);}// 获取叶子节点的个数//子问题的思路整颗树的叶子节点个数左子树的叶子节点右子树的叶子节点int getLeafNodeCount(TreeNode root) {if (root null) {return 0;}if (root.left null root.right null) {return 1;}return getLeafNodeCount(root.right) getLeafNodeCount(root.right);}//遍历思路以某种方式遍历这棵树只要发现是叶子就public int leafSize;public void getLeafNodeCount2(TreeNode root) {if (root null) {return;}if (root.left null root.right null) {leafSize;}getLeafNodeCount(root.left);getLeafNodeCount(root.right);}// 获取第K层节点的个数int getKLevelNodeCount(TreeNode root, int k) {if (root null) {return 0;}if (k 1) {return 1;}return getKLevelNodeCount(root.left, k - 1) getKLevelNodeCount(root.right, k - 1);}// 获取二叉树的高度(整棵树的高度Math.max(左树高度右树高度)1int getHeight(TreeNode root) {if (root null) {return 0;}int leftHeight getHeight(root.left);int rightHeight getHeight(root.right);return leftHeight rightHeight ? leftHeight 1 : rightHeight 1;}// 检测值为value的元素是否存在TreeNode find(TreeNode root, int val) {if (root null) {return null;}if (root.val val) {return root;}TreeNode ret find(root.left, val);if (ret ! null) {return ret;}ret find(root.right, val);if (ret ! null) {return ret;}return null;}