二叉树

还原二叉树--已知先序中序或者后序中序

假装没事ソ 提交于 2020-12-17 13:53:18
首先,我们看看前序、中序、后序遍历的特性: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 (个人觉得这个命名略微有误导性,因为前序的“前”容易让人误会成树的最前边(视觉上的左边)。记住前序遍历就是最直接(直觉上的)遍历——中左右) 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 (同样是有误导性的名字。 遍历顺序——左中右) 后序遍历: 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 (同样是有误导性的名字,“后”字没有任何意义,所有二叉树的遍历,左边一定在右边的之前进行遍历。 遍历顺序——左右中。) 接着,铭记总的方针 1. 找到根节点,确定左子树,确定右子树 (最重要) 2. 对左子树进行递归分析 3.对右子树进行递归分析 一、已知先序、中序遍历,求后序遍历 例: 先序遍历: GDAFEMHZ 中序遍历: ADEFGHMZ 思路分析: 1. 根据先序遍历的特点——中左右,第一个元素一定是根节点,所以立刻确定G是根节点。 2. 既然确定了G是根节点,再根据中序遍历的特点——左中右,在根节点G之前的ADEF就是左子树,根节点G之后的HMZ就是右子树。 3.接着分析左子树(思路和第1,2步一样)。把左子树的所有元素(即 ADEF这四个元素 )在先序遍历和中序遍历中的顺序拿出来进行比较。 先序的顺序是 DAFE (中左右)

二叉树的性质以及二叉树的遍历(非递归)(c语言)(一)

血红的双手。 提交于 2020-03-01 23:11:12
二叉树的性质: 性质 1 在二叉树的第i层上至多有2^(i-1)个结点(i>=1)。 性质 2 深度为k的二叉树至多有2^k-1个结点,(k>=1)。 性质 3 任何一颗二叉树,终端结点为n0,度为2的结点为n2,那么n0=n2+1。 性质 4 具有n个结点的完全二叉树的深度为└㏒2 n┘+1。 性质 5 完全二叉树按层次从上到下从左到右依次编号。编号为n的节点的左孩子为2n。 二叉树的储存结构 : lchild data rchild /*---------二叉树的二叉链表储存表示----------*/ typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; }BiTNode ,*BiTree; 非递归遍历需要栈:栈的实现过程: 栈的线性储存结构与链式储存结构的实现(C语言) 。 栈部分的内容: typedef BiTree pElemType; typedef struct Snode //栈的储存结构 { pElemType data; //数据域 struct Snode *next; //指针域 }Snode,*LinkStack; void Init_StackL(LinkStack *S) //初始化院栈 { *S=NULL; } Status Push_L(LinkStack

二叉树的递归,非递归遍历,深度优先遍历,广度优先遍历

馋奶兔 提交于 2020-03-01 03:57:10
/** * 二叉树的定义和遍历 */ public class BinaryTree { /** * 打印节点的信息 */ public void printNode(TreeNode<String> node){ System.out.print(node.getData()+" "); } /** * 递归先序遍历二叉树 */ public void preIterator(TreeNode<String> node){ this.printNode(node); if (node.getLefNode() != null) { this.preIterator(node.getLefNode()); } if (node.getRigNode() != null) { this.preIterator(node.getRigNode()); } } /** * 递归中序遍历二叉树 */ public void midIterator(TreeNode<String> node){ if (node.getLefNode() != null) { midIterator(node.getLefNode()); } this.printNode(node); if (node.getRigNode() != null) { midIterator(node.getRigNode(

BFS实现从上往下打印二叉树

牧云@^-^@ 提交于 2020-01-07 13:56:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印 深度优先搜索算法(Breadth-First-Search) 深度优先算法是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅助实现BFS算法。 算法步骤 1. 首先将根节点放入队列中。 2. 从队列中取出第一个节点,并检验它是否为目标。 如果找到目标,则结束搜寻并回传结果。 否则将它所有尚未检验过的直接子节点加入队列中。 3. 若队列为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。 4. 重复步骤2 代码实现 public ArrayList<Integer> printFromTopToBottom(TreeNode root) { if (root == null) return new ArrayList<Integer>(); ArrayList<Integer> list = new ArrayList<Integer>(); ArrayDeque<TreeNode> queue = new ArrayDeque<TreeNode>(); // 首先将根节点放入队列中 queue.offer(root);

java求二叉树的深度

◇◆丶佛笑我妖孽 提交于 2019-12-07 02:00:24
题目 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题 package demo18; class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } /** * 获取二叉树深度 * @author mengfeiyang * */ public class Solution2 { public int TreeDepth(TreeNode pRoot){ if(pRoot ==null) return 0; int nLeft=TreeDepth(pRoot.left); int nRight=TreeDepth(pRoot.right); return nLeft>nRight?(nLeft+1):(nRight+1); } /** * 测试 * @param args */ public static void main(String[] args) { Solution2 s2 = new Solution2(); /** * 构造二叉树 * 1 * / \ * 2 3 * / \ / \ * 4 5 6 7 */

Head First C学习日志 第六章 最高机密 二叉树和valgrind工具

依然范特西╮ 提交于 2019-12-04 07:40:58
程序会从根节点开始提问,其左右子树为疑犯名字或另外一个问题。先看数据结构: typedef struct node { char *question; struct node *no; struct node *yes; } node; 一个递归结构,内容很简单,一个char*指针,两个node指针。 节点的创建函数: node *create(char *question) { node *n = malloc(sizeof(node)); n->question = strdup(question); n->no = NULL; n->yes = NULL; return n; } 先分配空间,然后拷贝question字符串常量,两个node指针置空。 节点的销毁函数: void release(node *n) { if (n) { if (n->no) release(n->no); if (n->yes) release(n->yes); if (n->question) free(n->question); free(n); } } 从输入节点开始遍历,递归销毁其子树,释放n->question字符串,最后释放n。 一个通用的判断输入y/n的函数: int yes_no(char *question) { char answer[3]; printf("%s? (y/n

重构二叉树之前序遍历和中序遍历

我是研究僧i 提交于 2019-12-02 07:16:12
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8} 和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回 代码实现: /** * @param pre * 二叉树的前序遍历结果 * @param in * 二叉树的中序遍历结果 * @return root 重构完成的二叉树的根节点 */ public TreeNode reConstructBinaryTree(int[] pre, int[] in) { // 前序遍历或者中序遍历的结果已构建完, 递归退出 if (pre == null || in == null || pre.length == 0 || in.length == 0) { return null; } // 用前序遍历的结果的第一个元素, 构造二叉树的根节点 TreeNode root = new TreeNode(pre[0]); int i; // 在中序遍历的结果中,找出根节点pre[0]所在下标 for (i = 0; i < in.length; i++) { if (in[i] == pre[0]) { break; } } // 构建当前根节点的左子树时, 前序遍历的数组为pre[1..i]

剑指offer:java判断二叉树是否对称

旧街凉风 提交于 2019-11-26 12:28:55
题目 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 解题 两个二叉树的前序遍历一样 同时需要考虑空结点 class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public class Solution { boolean isSymmetrical(TreeNode pRoot){ return isSymmetrical(pRoot,pRoot); } boolean isSymmetrical(TreeNode root1,TreeNode root2){ if(root1==null && root2==null) return true; if(root1==null || root2==null) return false; if(root1.val!=root2.val) return false; return isSymmetrical(root1.left,root2.right) && isSymmetrical(root1.right,root2.left); } } 来源: oschina 链接: