后序遍历

二叉树的遍历

烈酒焚心 提交于 2019-12-02 12:25:28
递归遍历 前序 //前序遍历 void PreOrder(BTnode *pnode) { if (pnode) { visit(pnode); PreOrder(bnode->left); PreOrder(bnode->right); } } 中序 //中序遍历 void InOrder(BTnode *pnode) { if (pnode) { InOrder(pnode->left); 递归遍历 visit(pnode); InOrder(pnode->right); } } 后序 //后序遍历 void PostOrder(BTnode *pnode) { if (pnode) { PostOrder(pnode->left); PostOrder(pnode->right); visit(pnode); } } 非递归遍历 前序 ​ 先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。 //前序遍历 void PreOrder1(BTnode *pnode) { stack<*BTnode> s; BTnode *p = pnode; while (p || !s.empty()) { while (p) { visit(p); //先访问根节点,再入栈 s.push(p); p = p->left; /

与世无争的帅哥 提交于 2019-12-02 11:42:39
树的介绍 1. 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: (01) 每个节点有零个或多个子节点; (02) 没有父节点的节点称为根节点; (03) 每一个非根节点有且只有一个父节点; (04) 除了根节点外,每个子节点可以分为多个不相交的子树。 2. 树的基本术语 若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。有相同双亲的结点互为"兄弟"。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。 结点的度 :结点拥有的子树的数目。 叶子 :度为零的结点。 分支结点 :度不为零的结点。 树的度 :树中结点的最大的度。 层次 :根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。 树的高度 :树中结点的最大层次。 无序树 :如果树中结点的各子树之间的次序是不重要的,可以交换位置。 有序树 :如果树中结点的各子树之间的次序是重要的, 不可以交换位置。 森林 :0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。 二叉树的介绍 1. 二叉树的定义 二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

二叉树的前中后序遍历

ⅰ亾dé卋堺 提交于 2019-12-02 11:16:47
二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右 中序遍历:中序遍历的顺序为左-根-右 后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。 1.根结点入栈; 2.循环取栈顶元素、右子结点入栈、左子结点入栈。 JAVA参考代码 public class TreeNode { int val ; TreeNode left ; TreeNode right ; ​ TreeNode ( int val ) { this . val = val ; } } public List < Integer > preorderTree ( TreeNode root ) { Stack < TreeNode > stack = new Stack < > ( ) ; List < Integer > preorder = new ArrayList < > ( ) ; ​ if ( root == null ) { return preorder ; } ​ stack . push ( root ) ; while ( ! stack . empty ( ) ) { TreeNode node = stack . pop ( ) ; preorder . add ( node . val ) ; if (

二叉树的递归遍历(java实现)

跟風遠走 提交于 2019-12-02 11:04:30
二叉树的递归遍历(java实现) 二叉树是数据结构中非常重要的一章,而二叉树的遍历是重中之重。本文记载了我构造二叉树并对一棵简单的二叉树进行前、中、后序遍历的经验,因为本人是新手,不足之处还请谅解,欢迎指正。 创建树类 package tree ; public class BinaryTree { TreeNode root ; public BinaryTree ( ) { System . out . println ( "创建一棵树完成" ) ; } //设置根节点 public void setRoot ( TreeNode root ) { this . root = root ; System . out . println ( "在树中成功创建了一个根节点" ) ; } } 创建节点类 package tree ; public class TreeNode { //节点中具有value值,此处声明 int value ; //值的两端是左右节点的引用 TreeNode leftNode ; TreeNode rightNode ; //构造器,在声明一个节点时传值。 public TreeNode ( int value ) { this . value = value ; } //创建一个节点的左节点 public void setLeftNode (

二叉树建立与遍历

北慕城南 提交于 2019-12-02 11:04:19
1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的中序遍历结果; 3.输出二叉树的前序遍历结果; 4.输出二叉树的后序遍历结果; 5.输出二叉树的层序遍历结果。 # include <iostream> using namespace std ; typedef struct BiTNode { char data ; struct BiTNode * lchild , * rchild ; } BiTNode , * BiTree ; void CreateBiTree ( BiTree & T ) { char x ; cin >> x ; if ( '#' == x ) T = NULL ; else { T = new BiTNode ; T - > data = x ; CreateBiTree ( T - > lchild ) ; CreateBiTree ( T - > rchild ) ; } } void PreOrderTraverse ( BiTree T ) { if ( ! T ) return ; else { cout << T - > data << " " ; PreOrderTraverse ( T - > lchild ) ; PreOrderTraverse ( T - > rchild ) ; } } void

LeetCode#二叉树的非递归遍历

依然范特西╮ 提交于 2019-12-02 02:35:47
二叉树的非递归遍历 **根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: ** 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。 ** void preOrder2(BinTree *root) //非递归前序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { cout<<p->data<<""; s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); s.pop(); p=p->rchild; } } } **根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下:

二叉树的遍历

廉价感情. 提交于 2019-12-01 22:12:22
二叉树的中序遍历: 迭代: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res,stack = [],[] while True: while root: stack.append(root) root = root.left if not stack: return res node = stack.pop() res.append(node.val) root = node.right return res 递归: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res = [] def helper(root): if not root: return helper(root.left) res.append(root.val) helper(root.right) helper(root) return res 另: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: f = self.inorderTraversal return f(root.left) + [root.val]

二叉树创立及遍历

六眼飞鱼酱① 提交于 2019-12-01 18:25:25
编写程序实现二叉树的创建,先序、中序、后序的递归遍历算法。在此基础上设计一个主程序完成如下功能: (1 )依次读入字符 “ABD∅∅E∅∅C∅FG∅∅H∅∅” , 按照先序建立二叉树T(∅表示空格); ( 2)先序递归遍历二叉树T,输出遍历序列; ( 3)中序递归遍历二叉树T,输出遍历序列; (4 )后序递归遍历二叉树 T,输出遍历序列。 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAXSIZE 70 typedef struct BiTreeNode { char data; struct BiTreeNode *left; struct BiTreeNode *right; }BiTreeNode, *BiTree; void CreateBiTree(BiTree *T) { char val; scanf_s("%c", &val); if (val == '0') *T = NULL; //null表示为空枝 else { *T = (BiTree)malloc(sizeof(BiTreeNode)); (*T)->data = val; CreateBiTree(&(*T)->left); CreateBiTree(&(*T)->right); } } void

LeetCode-144 二叉树的前序遍历

南笙酒味 提交于 2019-12-01 09:56:54
问题: 如标题 分析:   非递归前序遍历和后序遍历一样,唯一不同的两个点是: 1.后序遍历需要头插,所以只能用链表(linkedlist) 2.左右节点判断是否为空的顺序颠倒。 除了以上两点以外其他代码完全相同。 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> listTree = new ArrayList(); if(root==null){ return listTree; } Stack s = new Stack(); TreeNode node; s.push(root); while(!s.empty()){ node = (TreeNode)s.pop(); listTree.add(node.val); if(node.right!=null){ s.push(node.right); } if(node.left!=null){ s