后序遍历

C++ 二叉树的创建于遍历

旧城冷巷雨未停 提交于 2019-12-04 13:27:32
头文件(bitree.hpp) 1 #pragma 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 #include<stack> 6 using namespace std; 7 struct TreeNode 8 { 9 int NodeData; 10 TreeNode *pLeft; 11 TreeNode *pRight; 12 TreeNode(int x) :NodeData(x), pLeft(NULL),pRight(NULL) {} 13 }; 14 class Mytree 15 { 16 public: 17 void insertTree(TreeNode* proot,int n) 18 { 19 20 } 21 void PreOrderno(TreeNode *T)//前序遍历,递归 22 { 23 if (!T) 24 return; 25 if (T) 26 { 27 cout << T->NodeData << endl; 28 PreOrderno(T->pLeft); 29 PreOrderno(T->pRight); 30 31 } 32 33 } 34 void PreOrder(TreeNode *T)//非递归,前序遍历 35 { 36 if (T ==

二叉树的非递归遍历C++实现

谁说我不能喝 提交于 2019-12-04 12:17:32
#include<iostream> #include<stdlib.h> #define maxsize 100 using namespace std; typedef struct BTNode{ char val; BTNode *lchild, *rchild; }*BiTNode; void CreateTree(BTNode *&root){ char c; cin >> c; if(c == '#') root = NULL; else{ root = (BTNode *) malloc(sizeof(BTNode)); if(!root){ cerr << "No More Memory!" << endl; exit(-1); } root->val = c; CreateTree(root->lchild); CreateTree(root->rchild); } } void PreOrderRecursion(BTNode *root){ if(root){ cout << root->val << " "; PreOrderRecursion(root->lchild); PreOrderRecursion(root->rchild); } } void PreOrderNoRecursion(BTNode *root){ if(!root){ cout

二叉树的层次遍历

一个人想着一个人 提交于 2019-12-04 10:50:19
如何遍历一棵树 有两种通用的遍历树的策略: 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。 深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为先序遍历,中序遍历和后序遍历。 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。 下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5 的顺序来比较不同的策略。 本问题就是用宽度优先搜索遍历来划分层次:[[1], [2, 3], [4, 5]]。 方法 1:递归 算法 最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下: 输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。 将当前节点插入到对应层的列表 levels[level] 中。 递归非空的孩子节点:helper(node.left / node.right, level + 1)。 实现 class Solution { List<List<Integer>> levels = new

二叉树遍历的递归实现(先序、中序、后序和层次遍历)

我的梦境 提交于 2019-12-04 09:35:41
由二叉树的定义可知,一棵二叉树由根结点、左子树和右子树三部分组成。因此,只要遍历了这三个部分,就可以实现遍历整个二叉树。若以D、L、R分别表示遍历根结点、左子树、右子树,则二叉树的递归遍历可以有一下三种方式: 先序遍历(DLR) 先序遍历的递归过程为 (1)访问根结点 (2)先序遍历根结点的左子树 (3)先序遍历根结点的右子树 举例: 代码: void PreOrder(BiTree bt) { if(bt ==NULL)return; //递归的结束条件----某结点为空时 printf("bt->data); //这里用printf data表示访问结点的数据域 PreOrder(bt->lchild); //递归遍历左孩子 PreOrder(bt->rclild); //递归遍历右孩子 } 中序遍历(LDR ) (1)中序遍历根结点的左子树 (2)访问根结点 (3)中序遍历根结点的右子树 举例: 代码: void PreOrder(BiTree bt) { if(bt ==NULL)return; //递归的结束条件----某结点为空时 PreOrder(bt->lchild); //递归遍历左孩子 printf("bt->data); //这里用printf data表示访问结点的数据域 PreOrder(bt->rclild); //递归遍历右孩子 } 后序遍历(LRD)

21 遍历二叉树(三种遍历方式:左根右(中序), 根左右(先序), 左右根(后序))

烂漫一生 提交于 2019-12-04 07:09:57
二叉树遍历:   顺着一条搜索路径访问二叉树中的节点,每个节点均被访问一次,且只被访问一次。 遍历目的:   得到树中所有节点的一个线性排列。 遍历用途:    是二叉树元素增删改查等操作的前提。 波兰式(先序)、逆波兰式(后序)等: 来源: https://www.cnblogs.com/CPU-Easy/p/11845878.html

树和二叉树一篇就搞定!

[亡魂溺海] 提交于 2019-12-04 03:42:46
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

第106题:从中序与后序遍历序列构造二叉树

拥有回忆 提交于 2019-12-04 03:39:11
一. 问题描述 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 二. 解题思路 本题思路:采用中序和后序遍历的特性进行求解,跟第105题几乎完全相同,只是把前序第一个必定是根节点,改成后序最后一个必定是根节点这点区别,没啥说的,具体可看第105题。 三. 执行结果 执行用时 :21 ms, 在所有 java 提交中击败了37.40%的用户 内存消耗 :51.4 MB, 在所有 java 提交中击败了8.79%的用户 四. Java代码 class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { if(postorder.length>0) { TreeNode root =new TreeNode(postorder[postorder.length-1]); List<Integer> order=new ArrayList<Integer>(); for(int i=0;i<inorder.length;i++) { order.add(inorder[i]);

leetcode 99:恢复二叉搜索树

一曲冷凌霜 提交于 2019-12-04 02:36:59
方法一:首先使用中序遍历将所有的节点和节点的值存起来,如果是搜索二叉树节点值的数组应该是升序的,找到不是升序的点,交换节点的值,空间复杂度为O(n) void inorder(TreeNode*root,std::vector<TreeNode*>&list,std::vector<int> &vals){ if(root==NULL) return; inorder(root->left,list,vals); list.push_back(root); vals.push_back(root->val); inorder(root->right,list,vals); } void recoverTree(TreeNode*root){ std::vector<TreeNode*>list; std::vector<int>vals; inorder(root,list,vals); std::vector<int> node; for(int i=0;i<vals.size()-1;){ if(vals[i]>vals[i+1]) { node.push_back(i); i=i+2; if(node.size()==2) break; }else i=i+1; } if(node.size()==1) { int c=node.back(); node.clear();

不一样的二叉树遍历(小学生都会)

百般思念 提交于 2019-12-04 01:46:46
二叉树遍历 二叉树的遍历分为三种,分别是前序遍历,中序遍历和后序遍历。(在这里,我会介绍两种方法) 前序遍历:先根后左子树最后右子树。 中序遍历:先左子树后根最后右子树。 后序遍历:先左子树后右子树最后根。 举个中序遍历例子 原图网址: https://img2018.cnblogs.com/blog/1706194/201910/1706194-20191006152149771-1726377171.png 其它的遍历可以以此类推。这是标准的二叉树遍历方法。 高端方法 刚才的做法很标准,也很好理解,但有些慢。下面的方法显然要省时,简单一些。 -----------------------------------------------------华丽的下划线-------------------------------------------------------- 还以这幅图为例 我们把这颗树以根节点为起点圈起来。 当这条线经过一个节点的前方时,则这个点为前序遍历的一个点。 当这条线经过一个节点的中间时,则这个点为中序遍历的一个点。 当这条线经过一个节点的后方时,则这个点为后序遍历的一个点。 还以中序遍历为例,经过点的顺序为BDCEHGKF。 高 端大气上档次, 我用这个方法压线过了初赛。 不要问我原理,我也不知道。 来源: https://www.cnblogs.com

数据结构学习--Java遍历二叉树

柔情痞子 提交于 2019-12-03 23:56:29
一、遍历树 遍历树是根据一个特定的顺序访问树的每一个节点,根据顺序的不同分为前序、中序、后序遍历三种。 二、前序遍历   1、访问根节点   2、前序遍历左子树   3、前序遍历右子树 三、中序遍历   1、中序遍历左子树   2、访问根节点   3、中序遍历右子树 四、后序遍历   1、后序遍历左子树   2、后序遍历右子树   3、访问根节点 代码实现 package com.example.deer;public class Tree { //根节点 public Node root; /** * 插入节点 * @param value */ public void insert(long value,String sValue){ //封装节点 Node newNode = new Node(value,sValue); //引用当前节点 Node current = root; //引用父节点 Node parent; //如果root为null,也就是第一次插入的时候 if(root == null){ root = newNode; return; }else{ while (true){ //父节点指向当前节点 parent = current; //如果当前指向的节点数据比插入的要大,则向左走 if(current.data > value){ current =