知识梳理---二叉树
hy3686_1991
这个作者很懒,什么都没留下…
展开
-
二叉树------树的子结构
题目描述: 给定两棵二叉树tree1与tree2,现在要求判断tree2是否为tree1的一个子树. 分析: 可以使用递归的方法,找到与tree2根节点值相同的tree1的节点n,然后递归调用函数对以n为根节点的子树进行判定。#include <iostream>#include <stdio.h>using namespace std;#define N 100struct Node原创 2016-05-26 16:50:00 · 323 阅读 · 0 评论 -
二叉树------之字形打印二叉树
题目描述: 实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 分析: 对于一个n层的二叉树,可以使用一个数组将二叉树按层序记录下来,特别的为了明确的分割每一层,要将二叉树的前n-1层填满。方法是,对于一个NULL节点,若在它之后还有不为NULL的结点那么就用NULL填充它的子节点位置,直到遍历完所有位原创 2016-08-08 18:30:38 · 812 阅读 · 0 评论 -
二叉树------对称二叉树
题目描述: 给定一棵树,判断它是不是对称二叉树。 分析: 面对此题,开始时想使用树的中序遍历,二叉树对称时,其中序遍历结果是一个回文串。但这只是一个必要非充分条件,例如对于二叉树{5, 5, 5, 5, #, #, 5, #, 5} 它的中序遍历结果是一个回文串,但它不是一棵对称二叉树。然后,考虑使用递归,对称二叉树与其镜像完全相同,则递归的判断当前结点与其镜像结点的值是否相同,从而来判断二叉原创 2016-08-08 17:23:59 · 422 阅读 · 0 评论 -
二叉树------二叉树的下一个结点
题目描述: 给定一棵二叉树和一个结点,要求找到中序遍历此树时该结点的下一个结点。 分析: 中序遍历一棵二叉树时,要根据一个结点有无右子树而分开讨论。若当前结点有右子树,则它的下一个结点就是其右子树的最左叶子结点;若当前结点没有右子树,那么又分两种情况: *若当前结点是其父节点的左孩子结点,那么其下一个结点就是其父结点; *若当前结点是其父节点的有孩子结点,那么沿着指向其父结点的指针向原创 2016-08-08 16:56:13 · 397 阅读 · 0 评论 -
二叉树------寻找二叉树中两个结点的最近公共祖先
题目描述: 给定一棵二叉树以及它的两个结点,求这两个结点在这棵二叉树中的最近公共祖先结点。 思路分析: 1. 倘若这棵二叉树是一棵二叉查找树,那么就从根结点开始,使用前序遍历每个结点,当到达某个结点n时,若有结点n的值大于其中一个结点而小于另一个结点,则结点n就是要找的结点; 2. 若二叉树中,每个结点都有一个指向其父结点的指针,那么此问题就可以转化为寻找两个链表的第一个公共结点。 3.原创 2016-08-27 16:43:35 · 988 阅读 · 0 评论 -
二叉树------由前序和中序求后序
题目描述:已知一棵树的前序和中序遍历结果,求其后序结果。 分析: 对于一个二叉树而言,若知道其前序和中序,那么就能唯一确定其后序。方法就是通过每次判断,递归的得到每棵子树。Node* Rebuild(int *pre, int *mid, int length){ if(pre == NULL || mid == NULL || length < 1) retu原创 2016-06-20 11:11:25 · 244 阅读 · 0 评论 -
二叉树------二叉查找树的相关内容
性质 若它的左子树不为空,则左子树上所有的结点值均小于它根结点的值;若它的右子树不为空,则右子树上所有的结点值均大于它根结点的值;它的左、右子树也都是二叉查找树。 二叉查找树的相关操作 1.二叉树的二叉链表结点结构定义typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;}BiTNo原创 2016-07-14 16:06:18 · 214 阅读 · 0 评论 -
二叉树------二叉查找树转化为双向链表
题目描述: 将一棵二叉查找树转换为有序的双向链表。 分析: 由于二叉查找树的的特性,可以使用中续编历得到一个升序序列。基于此,可以改造得到一个升序的双向链表。其具体方步骤是:使用递归的方式先找到最左也子结点,使用一个laset指针记录被操作过得最后一个结点。初始时,last = NULL,在每次递归中使得current->left = last;last->right = current;然后原创 2016-07-14 15:11:16 · 234 阅读 · 0 评论 -
二叉树------二叉搜索树的后序遍历序列
题目描述: 给定一个序列,判定其是否为一个二叉搜索树的后序遍历序列。 分析: 二叉搜索树的要求是:左子树中的节点都比根节点小,右子树的节点都比根节点大。则,其后序遍历的结果满足要求:根节点是序列的最后一个元素;从左开始找到第一个比它大的元素就是右子树的开始,且有从此元素到倒数第二个元素都比它大。递归的使用此方法对所有字数进行判断,就可得到最终结果。#include <iostream>usi原创 2016-05-31 10:20:23 · 322 阅读 · 0 评论 -
二叉树------和为定值的全部路径
题目描述: 给定一棵二叉树和一个定值sum,要求得到二叉树中从根节点开始到某个叶节点结束的所有路径使得路径上所有结点值的和与sum相等. 分析: 可以使用先序遍历的方法,递归的遍历整棵树。struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right; TreeNode(in原创 2016-06-29 09:56:06 · 471 阅读 · 0 评论 -
二叉树------层序遍历
题目描述: 给定一棵二叉树,要求从上到下按层输出。(每一层按从左到右的顺序) 思路: 按照按层创建二叉树的方法,使用一个队列。先将根节点入队,然后每次从队中取出队首元素,并将其左右子节点入队,持续此过程知道队列为空。(NULL不入队)#include <iostream>#include <deque>#include <stdio.h>using namespace std;#def原创 2016-05-31 09:52:11 · 240 阅读 · 0 评论 -
二叉树------序列化与反序列化二叉树
题目描述: 实现两个函数,分别用来序列化和反序列化一棵二叉树。 分析:对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个’ , ‘作为分割。对于空节点则以 ‘#’ 代替。char* Serialize(TreeNode *root){ if(root == NULL) return NULL;原创 2016-08-09 12:18:47 · 441 阅读 · 0 评论