二叉树遍历

由前序遍历和中序遍历重建二叉树

牧云@^-^@ 提交于 2020-03-15 16:50:59
编程之美3.9:给出前序遍历和中序遍历,重新创建二叉树,后序遍历输出。代码如下: View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 Node* m_lChild; 9 Node* m_rChild; 10 char data; 11 }; 12 13 void AfterTra(Node* pRoot) 14 { 15 if (!pRoot) 16 { 17 return; 18 } 19 AfterTra(pRoot->m_lChild); 20 AfterTra(pRoot->m_rChild); 21 cout<<pRoot->data<<" "; 22 } 23 24 //删除树的操作 25 void DestroyTree(Node*& pRoot) 26 { 27 if (!pRoot) 28 { 29 return; 30 } 31 DestroyTree(pRoot->m_lChild); 32 DestroyTree(pRoot->m_rChild); 33 delete pRoot; 34 } 35 36 //计算树中的节点个数 37 int TreeSize(Node* pRoot) 38 { 39 if (

L2-006. 树的遍历

耗尽温柔 提交于 2020-03-13 12:46:54
L2-006. 树的遍历 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 思路:我没有学过数据结构,也就是了解过堆和线段树,利用二叉树的遍历来还原二叉树也是蛮有意思的。 首先观察后序遍历,根据后序遍历的特点,可以发现最后一个节点一定是子树根节点,所以样例中的4便是祖先节点。然后再观察中序遍历,中序遍历的特点就是先把左子树的节点输出,在输出根节点,在输出右子树。根据前序遍历,就可以发现,根节点的左子树集合和右子树集合。 不管二叉树是如何遍历的,每子颗树上节点一定是在一个挨在一起的,只是访问的先后顺序不同。然后观察4的左子树,利用后序遍历可以找的左子树的根节点为1,在中序遍历中观察1,发现他只有一个右子树{2,3},利用后序遍历可知3是1的右子树,2是3的左子树。 同样的道理,对4的右子树的后序遍历进行见检查,发现6是右子树的根节点,利用中序遍历可知,6的左孩子为5,右孩子为7。

Python实现完全二叉树以及遍历

早过忘川 提交于 2020-03-11 17:57:09
在学校刚刚学到的二叉树是用C语言来实现的,还涉及到了指针等操作。最近疫情原因不能开学,就自己学习了一下Python,就拿Python来试着实现一下,顺便再复习一下二叉树的一些知识。 本文使用Python来构建一个完全二叉树,并且实现树结点添加,层次遍历,先序遍历,中序遍历,后序遍历。 由于我自己对二叉树的理解也不是很深,所以关于二叉树的理论知识就只能自行脑补了,这里直接开始实现了,在实现的过程中也可能会有一些错误,还请大佬们批评指正。 以下为实现的思路,完整代码以及输出可以直接滑倒最后查看。 创建结点 首先创建一个结点的类,结点含有数据和左子,右子,创建后就直接将左子,右子初始化为None,数据则从外部输入进去。 # 创建一个结点的class class Node(object): def __init__(self,valua): self.valua = valua self.Lchild = None self.Rchild = None 然后创建一个二叉树的类,因为结点已经创建了一个node的类,这里只需要初始化一个根结点为None就可以了。 # 创建一个二叉树class class Btree(object): def __init__(self): # 初始化根结点 self.root = None 添加结点 接下来就可以来实现添加结点的funtion类。

leetcode 543. 二叉树的直径(python)

一世执手 提交于 2020-03-10 22:12:40
题解: 本题用深度优先搜索 我们通过画图来找寻本题的思路; 容易分析得,本题需要两个dfs,一个是遍历左结点的子树,一个遍历右结点的子树; 如图所示,首先遍历左边的结点一直到根; def dfs ( node ) : if not node : return 0 dfs ( node . left ) 此时需要进行回溯,回溯到结点2;但是路径长度需要+1;因此代码更改如下所示: def dfs ( node ) : if not node : return 0 l = dfs ( node . left ) return l + 1 同理,对右边结点的遍历也是上述的代码,即如下所示: def dfs ( node ) : if not node : return 0 r = dfs ( node . right ) return r + 1 左右子树合在一起。计算以当前结点为根的最大深度代码如下所示: def dfs ( node ) : if not node : return 0 l = dfs ( node . left ) r = dfs ( node . right ) return max ( l , r ) + 1 因此最大路径为:L+R。 代码如下所示: class Solution : def diameterOfBinaryTree ( self , root

二叉树的基础遍历---前序遍历,中序遍历以及后序遍历

早过忘川 提交于 2020-03-10 05:08:35
二叉树的基础遍历 1:前序遍历 :先访问根结点,然后再访问左子树,最后访问右子树; 2:中序遍历 :先访问左子树,然后再访问根结点,最后访问右子树; 3:后序遍历 :先访问左子树,然后再访问右子树,最后访问根结点; 示例如下: 前序遍历的API设计: public Queue preErgodic():使用前序遍历,获取整个树中的所有键 private void preErgodic(Node x,Queue keys):使用前序遍历,把指定树x中的所有键放入到keys队列中 实现步骤: 把当前结点的key放入到队列中; 找到当前结点的左子树,如果不为空,递归遍历左子树; 找到当前结点的右子树,如果不为空,递归遍历右子树; 代码实现: //使用前序遍历获取整个树中所有的键 public Queue < Key > preErgoidic ( ) { Queue < Key > keys = new Queue < > ( ) ; preErgoidic ( root , keys ) ; return keys ; } //使用前序遍历获取指定树x的所有键,并放到Keys队列中 private void preErgoidic ( Node x , Queue < Key > keys ) { if ( x == null ) { return ; } /

二叉树遍历

冷暖自知 提交于 2020-03-09 18:17:40
两种遍历树的策略: 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。 方法一、递归 深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为前序遍历,中序遍历和后序遍历。 前序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根 res.push_back(root->val);//打印根节点 helper(root->left); helper(root->right); 迭代 深度优秀遍历用递归求解非常简单,难的是 迭代 方法: 前序遍历 首先我们应该创建一个 Stack 用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack,然后打印。 之后我们应该先打印左子树,然后右子树。所以先加入Stack的就是右子树,然后左子树。 此时你能得到的流程如下: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(!root)return {}; stack<TreeNode*> s; TreeNode *tmp=root; while(tmp || !s.empty()){ if(tmp){ s.push(tmp); res.push_back

前中后序遍历

好久不见. 提交于 2020-03-09 15:25:16
今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档。 树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回。 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成。 中序遍历:中序遍历可以记为左根右,也就是说在二叉树的遍历过程中,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。 同样,在二叉树为空的时候,结束返回。 中序遍历的规则: (1)中序遍历左子树 (2)访问根节点 (3)中序遍历右子树 注意:在完成第1,3步的时候,要按照中序遍历的规则来完成。 后序遍历:后序遍历可以记为左右根,也就是说在二叉树的遍历过程中,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,最后访问根节点。 在二叉树为空的时候,结束返回。 后序遍历二叉树的规则: (1)后序遍历左子树 (2)后序遍历右子树 (3)访问根节点 注意:在完成1,2步的时候,依然要按照后序遍历的规则来完成。 来源: https://www.cnblogs.com/ltc3344/p/12448565.html

二叉树的中序遍历

徘徊边缘 提交于 2020-03-09 05:02:26
文章目录 递归 递归时直接打印 辅助函数 迭代 基于栈的遍历 注 给定一个二叉树,返回它的中序 遍历。 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ 递归 递归时直接打印 public static void inOrderRecur(Node root){ if(root== null) return; inOrderRecur(root.left); System.out.print(root.value + " "); inOrderRecur(root.right); } 辅助函数 时间复杂度:O(n),递归函数T(n)=2*T(n/2)+1 空间复杂度:最坏情况下需要空间O(n),平均情况为O(logn) class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer>list = new ArrayList(); helper(root,

求后序遍历

北战南征 提交于 2020-03-08 01:05:29
描述 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。 格式 输入格式 共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。 输出格式 一行,表示树的后序遍历序列。 样例 输入样例 abdec dbeac 输出样例 debca #include <iostream> #include <stdio.h> #include <cstring> #include <stdio.h> #include <algorithm> #include <cmath> using namespace std; //abdhecfg //hdbeafcg //hdebfgca char pre[100],mid[100],rear[100]; int find(char a[],int x){ int len = strlen(a); for(int i=0; i<len; ++i){ if(a[i] == x){ return i; } } return -1; } void solve(char a[], char b[],int as, int ae, int bs, int be){ int m = find(b, a[as]); // printf("m = %c\n",b[m]); if(m == -1){ return ; } int i; char

剑指offer - 中序+先序遍历创建数组

痴心易碎 提交于 2020-03-07 09:22:14
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路: 在前序遍历里面找到第一个数,则这个数为root,然后在中序遍历的数组中找到这个数,则这个数前面的数都构成root的左子树,右边的点构成其右子树。 然后用递归 class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre) == 0: return None elif len(pre) == 1: return TreeNode(pre[0]) target = pre[0] for i in range(0,len(tin)): if tin[i] == target: root = TreeNode(target) root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i]) root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:]) return root