中序遍历

树的递归和非递归遍历

ε祈祈猫儿з 提交于 2019-11-29 23:41:38
利用循环和栈实现前序、中序和后序遍历、利用队列实现层次遍历 typedef struct node { int data; int cnt;//在后序遍历中使用,子树的根节点在第一次遍历的时候不会输出,只有在第二次遍历的时候才输出。 struct node *lchild; struct node *rchild; }bitree; stack<node*> s; 前序遍历 //针对一个根结点,先输出其根结点值,再push其所有左结点,然后再弹出一个结点取其右结点作为新的根结点。 void preorder(bitree *t)//前序遍历的非递归算法 { bitree *temp = t; while(temp != NULL || !s.empty()) { //遍历所有左结点 while(temp != NULL)//先遍历左孩子,并输出。 { printf("%4d",temp->data); s.push(temp); temp = temp->lchild; } if(!s.empty())//当左孩子遍历完后,取栈顶,找右孩子。此时循环还没有结束,再遍历它的左孩子,直至孩子全部遍历结束。 { temp = s.top(); s.pop(); temp = temp->rchild; } } printf("\n"); } 中序遍历 void inorder

已知二叉树先序遍历中序遍历求其后序遍历、重建二叉树

妖精的绣舞 提交于 2019-11-29 19:31:06
已知二叉树先序遍历中序遍历求其后序遍历 (注:已知中序遍历序列和剩下两种遍历序列中的一种都可以确定二叉树,即可得到另一种遍历序列, 但是已知前序遍历和后序遍历序列并不能唯一确定二叉树,例如:preorder:AB postorder:BA,我们不能确定B是A的左子还是右子。) 二叉树的先序遍历的第一个元素总是树的根结点,而在中序遍历中,根结点在序列的中间,其左右两边分别是根结点的左右子树。 因此我们可以根据先序遍历确定根结点,然后在中序遍历中扫描根结点,同时可得到左右子树的中序遍历和先序遍历,递归此过程,即可获得二叉树的所有结点。 而后序遍历即为根结点左子树的后序遍历+右子树的后序遍历+根结点。 递归实现思路非常简单,C++代码: string getpostorder(char* preorder, char* inorder, int length){ string str = ""; char* rootInorder; //根结点在中序遍历中的位置 int leftlength; //左子树长度 if (length <= 0||preorder==NULL||inorder==NULL)//递归边界条件 return ""; else{ leftlength = 0; rootInorder = inorder; //扫描根结点 while (leftlength <

二叉树的遍历

戏子无情 提交于 2019-11-29 18:36:30
一般的数据结构都有遍历操作,根据需求的不同,二叉树一般有四种遍历方式: 1、先序遍历 如果二叉树为空,遍历结束,否则,第一步,访问根节点;第二步,先序遍历根节点的左子树,第三部,先序遍历根节点的右子树。 2、中序遍历 如果二叉树为空,遍历结束,否则,第一步,中序遍历根节点的左子树;第二步,访问根节点,第三部,中序遍历根节点的右子树。 3、后序遍历 如果二叉树为空,遍历结束,否则,第一步,后序遍历根节点的左子树;第二步,后序遍历根节点的右子树,第三部,访问根节点。 4、层次遍历 从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层,则按从左到右的顺序对结点逐个访问。 通过上面的理论可以总结出先序遍历和中序遍历来求解二叉树的过程,步骤如下: a)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的根。 b)求解树的子树。找到根在中序遍历的位置,位置左边是二叉树的左孩子,位置右边是二叉树的右子树,如果根节点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。 c)对二叉树的左、右孩子分别进行步骤a)、b),直到求出二叉树结构为止。 来源: https://www.cnblogs.com/yazhong-java/p/11526318.html

python实现基础的数据结构(二)

非 Y 不嫁゛ 提交于 2019-11-29 18:33:55
本文涉及到的代码均已放置在我的github中 --> 链接 python实现基础的数据结构(一) python实现基础的数据结构(二) python实现基础的数据结构(三) python语法较为简洁,正好最近在复习数据结构,索性就用python去实现吧😀 本文实现的有线性表、栈、队列、串、二叉树、图、排序算法。参照教材为 数据结构(C语言版)清华大学出版社 ,还有网上的一些大神的见解。由于包含代码在内,所以内容很多,分了几篇,话不多说,我们直接步入正题🙈 注:本文实验环境:Anaconda 集成 python 3.6.5 ( 故代码为 python3 ) 由于本文代码过多,故每一步不做太详细的介绍,我尽量在代码中解释细节,望体谅 串 串是由零个或者多个字符组成的优先序列,一般记为是s = ‘a1a2…an’ ,python对字符串的操作已经比较成熟和简单,所以我们这里着重介绍串的模式匹配算法,这就不得不提KMP匹配算法,这种算法和正则表达式有类似之处,一个用了DFA的思想,一个用了NFA的思想。 KMP算法的思想是,当匹配失败时,可以利用已经知晓的一部分文本内容,避免从头开始重新匹配。这个匹配的过程可以使用有限状态自动机(DFA)。可以看看 这位大神 的描述。 每当一趟匹配过程中出现字符比较不等时,不需要回溯I指针,而是利用已经的带的“部分匹配

二叉树

大兔子大兔子 提交于 2019-11-29 17:33:30
1.1 二叉树的定义:   二叉树 是一种特殊的树,它具有以下 特点 :   (1)树中每个节点最多只能有两棵树,即每个节点的度最多为2。   (2)二叉树的子树有左右之分,即 左子树 与 右子树 ,次序不能颠倒。   (3)二叉树即使只有一个子树时,也要区分是左子树还是右子树。    1.2 满二叉树:   满二叉树 作为一种特殊的二叉树,它是指:所有的分支节点都存在左子树与右子树,并且所有的叶子节点都在同一层上。其 特点 有:   (1)叶子节点只能出现在最下面一层   (2)非叶子节点度一定是2   (3)在同样深度的二叉树中,满二叉树的节点个数最多,节点个数为: 2 h − 1 2h−1 ,其中 h h 为树的深度。       1.3 完全二叉树:   若设二叉树的深度为 h h ,除第 h h 层外,其它各层 ( 1 ~ h − 1 ) (1~h−1) 的结点数都达到最大个数,第 h h 层所有的结点都连续集中在最左边,这就是 完全二叉树 。其具有以下 特点 :   (1)叶子节点可以出现在最后一层或倒数第二层。   (2)最后一层的叶子节点一定集中在左部连续位置。   (3)完全二叉树严格按层序编号。(可利用数组或列表进行实现,满二叉树同)   (4)若一个节点为叶子节点,那么编号比其大的节点均为叶子节点。    二、二叉树的相关性质   2.1 二叉树性质:   

树、图、排序查找重要算法(960算法)

老子叫甜甜 提交于 2019-11-29 17:09:09
设计求T的WPL的算法:   (1) .给出二叉树结点的数据类型定义;   (2) .给出C语言描述算法;   【 1 】: typedef struct node { int weight; struct node *left,*right; //指向结点左右子女的指针 }BiNode,*BiTree;   【 2 】: int WPL=0; void inorder(BiTree bt,level lv) //bt是二叉树,lv是结点的层次,初值为1 { if(bt) {inorder (bt->left,lv+1); //中序遍历左子树 if(bt->left==null &&bt->right==null) //判断该结点是否为叶子 WPL+=(lv-1)*bt->weight; //累加结点带权路径长度 inorder(bt->right,lv+1); } } 【先序遍历】 NLR (递归) void PreOrder(BiTree T){ if(T!=NULL){ visit(T); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 preOrder(T->rchild); } } 【中序遍历】 LNR (递归) void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T)

LeetCode94:二叉树的中序遍历(Binary Tree Inorder Traversal)

房东的猫 提交于 2019-11-29 16:35:34
英文题目: Given a binary tree, return the inorder traversal of its nodes’ values. Example: Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2] Follow up: Recursive solution is trivial, could you do it iteratively? 中文题目: 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解答: C++ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> stk; auto p=root

线索二叉树的建立与遍历

烈酒焚心 提交于 2019-11-29 15:46:25
线索二叉树利用二叉树空余的指针域,来实现二叉树的链式化。然后,就可以通过前驱,后继像双向链表一样根据某种遍历次序对树的结点进行访问。 数据结构: 1 struct node{ 2 int data; 3 struct node* left,*right; 4 int ltag,rtag; //=0时,表明指向子结点;=1时,表示指向前驱/后继 5 } 建立线索二叉树: 不同的遍历顺序,会得到不同的线索二叉树。 一般使第线索链表的头和尾指向NULL(也可以加入一个头指针) 以中序遍历为例: 1 // p:当前结点,pre:前驱结点 ; 对每一个点进行处理(NULL,ltag=0,ltag=1) 2 void CreateNode(node &p,node& pre){ 3 if(p!=NULL){ 4 CreateNode(p->left,pre); // pre进行递归改变!!! 5 // 左子树为空 6 if(p->left==NULL){ 7 p->left=pre; 8 p->ltag=1; 9 } 10 // 建立前驱结点的后继线索 11 if(pre!=NULL && pre->right!=NULL){ 12 pre->right=p; 13 pre->rtag=1; 14 } 15 pre=p; 16 CreateNode(p->right,pre); 17 } 18

前序遍历和中序遍历树构造二叉树

白昼怎懂夜的黑 提交于 2019-11-29 15:39:41
根据中序遍历和后序遍历树构造二叉树 样例 样例 1: 输入:[],[] 输出:{} 解释: 二叉树为空 样例 2: 输入:[1,2,3],[1,3,2] 输出:{2,1,3} 解释: 二叉树如下 2 / \ 1 3 注意事项 你可以假设树中不存在相同数值的节点 /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** *@param preorder : A list of integers that preorder traversal of a tree *@param inorder : A list of integers that inorder traversal of a tree *@return : Root of a tree */ TreeNode * buildTree(vector<int> &preorder, vector<int> &inorder) { // write your code

二叉树算法题

断了今生、忘了曾经 提交于 2019-11-29 15:20:30
二叉树层次遍历 //思路 特殊情况 ,根节点为null,深度为0,return 0 借助队列,队列储存每一层的所有节点, 先保存数组长度,用于控制依次遍历循环——遍历每一个节点保存值,该节点的所有子结点从队尾入队,访问过的节点从头出队 注意——需要先把width存下来,用于for循环的结束标志,因为for循环里面直接操作了queue,不能去都不敢动态获取 队列初始值为root,对每一层都要进行上述遍历——while循环控制,队列空代表叶节点这一层遍历完成,此时遍历结束,退出循环 每次循环开始前初始化一个curNodes储存该层所有节点,每次循环结束,将curNodes压入result var levelOrder = function(root) { if (root === null) return []; //空树 var result = [], queue = [root]; while (queue.length) { let width = queue.length; //需要先把width存下来,用于for循环,for循环里面直接操作了数组 let curNodes = []; for (let i = 0; i < width; i++) { let node = queue.shift(); curNodes.push(node.val); node.left ?