二叉树遍历

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; } } } **根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下:

**LeetCode-145二叉树后序遍历

旧时模样 提交于 2019-12-01 09:55:54
问题: 后序遍历二叉树 分析:非递归后序遍历二叉树。直接后序遍历的话会很麻烦,所以我们要想一些精妙的方法,将后序遍历改成先序遍历并满足以下两个条件即可。 1.使用链表头插法来进行先序遍历。 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> postorderTraversal(TreeNode root) { LinkedList<Integer> output = new LinkedList(); if(root==null){ return output; } Stack s = new Stack(); TreeNode node; s.push(root); while(!s.empty()){ //注意记忆循环条件 node = (TreeNode)s.pop(); output.addFirst(node.val); if(node.left!=null){

*LeetCode-94 二叉树的中序遍历

╄→尐↘猪︶ㄣ 提交于 2019-12-01 09:50:24
问题: 中序遍历二叉树 分析: 1.递归解法 2.栈+循环    嵌套循环   内层循环一直判断当前节点有没有左节点,有就入栈,当前节点等于左节点,没有的话,就出栈打印,当前节点再等于右节点,然后回到开始进行循环判断右节点的左节点是不是空。 代码: import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> listTree = new ArrayList<Integer>(); TreeNode cur = root; Stack s = new Stack(); while(!s.empty()||cur!=null){ while(cur!=null){ s.push(cur); cur = cur.left; } cur = (TreeNode) s.pop(); listTree.add(cur.val); cur = cur.right; } return listTree; } } 来源: https://www.cnblogs.com/gmzqjn/p/11676578.html

数据结构与算法之二叉树

馋奶兔 提交于 2019-12-01 09:32:12
树 树的概念 树(英语:tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>=0)个有限节点组成一个具有层次关系的集合。把它叫做“ 树 ”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 当n=0时,为空树,在任何一棵空树中: 有且仅有一个特定的称为根(Root)的节点 当n>1时: 除根节点外,其余节点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树的术语 节点的度 :一个节点含有的子节点的个数称为该节点的度。 B的子节点为D、E、F, 因此,节点B的度为3。 树的度 :一棵树中,最大的节点的度称为树的度。 最大的节点的度为B节点的度,因此该树的度为3。 叶节点 或 终端节点 :度为零的节点。 不能往下再分的节点:K、J、F、L、O、P。 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点。 如:K的父节点为I。 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点。 B的孩子节点或子节点为:D、E、F。 兄弟节点

二叉树遍历

心已入冬 提交于 2019-12-01 02:39:53
public class BinaryTree { public static void main(String[] args) { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); print(root); } /** * 先序遍历:访问根结点的操作发生在遍历其左右子树之前。 根节点 -> 左子树 -> 右子树 1 2 4 5 3 6 7 * 中序遍历:访问根结点的操作发生在遍历其左右子树中间。 左子树 -> 根节点 -> 右子树 4 2 5 1 6 3 7 * 后序遍历:访问根结点的操作发生在遍历其左右子树之后。 左子树 -> 右子树 -> 根节点 4 5 2 6 7 3 1 * */ public static void print(Node root) { if (root == null) { return; } // 先序遍历,这行是第一次来到该节点 // System.out.print(root.value + " ");

二叉树的遍历

强颜欢笑 提交于 2019-12-01 02:27:21
* 先根序遍历(非递归版) 1 void PreOrder(TreeNode* root) 2 { 3 stack<TreeNode*> s; 4 TreeNode *p=root,*last_visit=NULL; 5 while(p||s.size()>0) 6 { 7 if(p)//走到最左 边走边访问 并进栈 8 { 9 cout<<p->val<<endl; 10 s.push(p); 11 p=p->left; 12 } 13 else//左边没有节点了 14 { 15 p=s.top();//弹出上一个节点 16 s.pop(); 17 p=p->right;//转向右子树 18 } 19 } 20 } * 中根序遍历(非递归版) void InOrder(TreeNode* root) { stack<TreeNode*> s; TreeNode *p=root,*last_visit=NULL; while(p||s.size()>0) { if(p)//走到最左 { s.push(p); p=p->left; } else//左边没有节点了 { p=s.top();//弹出上一个节点 s.pop(); cout<<p->val<<endl;//访问栈中弹出的节点 p=p->right;//转向右子树 } } } * 后根序遍历(非递归版) 1 void

根据先序遍历和中序遍历建立二叉树

感情迁移 提交于 2019-12-01 02:13:05
问题 ​ 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树。二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值。 思路 先序遍历服从规则 “根左右” ,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是 根节点 ; 中序遍历服从规则 ”左根右“ ,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的 左子树 ,而根节点右边的元素都属于根节点的 右子树 ; 所以,我们可以先通过先序遍历的第一个元素确定根节点,然后通过中序遍历结合根节点,获得当前根节点的左右子树,再将子树看成一棵独立的树,继续使用先序遍历判断根节点,中序遍历判断子树的方式,最终建立起整棵树; 例子 假设有一棵二叉树,先序遍历为 {1,2,4,7,3,5,6,8} ,中序遍历为 {4,7,2,1,5,3,8,6} ,则建树过程如下: 首先,通过先序遍历可知树的根节点为 1 ,则在中序遍历中,1左边的元素 4,7,2 即为根的左子树的元素,而 1 右边的元素 5,3,8,6 即为根节点的右子树; 对于左子树 4,7,2 来说,在先序遍历中,这三个点的顺序为 2,4,7 ,则 2 为根节点,而在中序遍历中, 4,7 均在 2 的左边,则 4,7 均为以 2 为根树的左子树,且没有右子树; 对于 4,7 这两个节点来说,先序遍历中, 4 节点在7节点之前,所以 4 为根节点,而 7

NOIp初赛题目整理

寵の児 提交于 2019-12-01 00:21:50
NOIp初赛题目整理 这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期更新。 1、(07senior,5) 在C 语言中,表达式 \(23~\mid~2~\land^~5\) 的值是( ) ​ A. \(23\) B. \(1\) C. \(18\) D. \(32\) E. \(24\) Answer:A Solution:这题一看就是要考运算符优先级来着。在 \(C\) 语言中, 按位与大于按位异或大于按位或 ,这里的大于指优先级大于,优先级越大越优先计算,因此计算过程为 \(2~\land~5~=~7\) 。然后计算 \(23~\mid~7 = 23\) 。 需要指出的是,左右移的优先级大于上述三个运算,因此 \(C\) 语言表达式 1 | p << 1 是先算 p << 1 ,再对 \(1\) 取或,例如 \(1~\mid~3~<<~1\) 的答案是 \(9\) 。 2、(07senior,12) 与十进制数 \(17.5625\) 对应的 \(8\) 进制数是( )。 ​ A. \(21.5625\) B. \(21.44\) C. \(21.73\) \(D.21.731\) Answer:B Solution:这里介绍一下分数的进制转换

二叉树遍历的几种实现

試著忘記壹切 提交于 2019-11-30 23:22:38
用c++是实现的二叉树的存储以及几种遍历方法 #include<iostream> #include<cstdlib> #include<stack> //使用stl中的栈模板 using namespace std; typedef struct BNode{ //定义节点的结构体 char data; //数据部分 BNode* Lc; //左孩子 BNode* Rc; //右孩子 }Bitree,*pBitree; pBitree CreatTree(pBitree root){ //利用递归存树 char c; cin>>c;//输入节点数据 if(c!='#'){ root = (pBitree)malloc(sizeof(Bitree)); root->data=c; root->Lc=CreatTree(root->Lc); root->Rc=CreatTree(root->Rc); } else root = NULL; return root; } void norecursionInorder1(pBitree root){ //不用递归的中序遍历1 stack<pBitree> st; pBitree p; st.push(root); while(!st.empty()){ while(st.top()!=NULL) { p=st.top(); st

图解数据结构-树及树的遍历

末鹿安然 提交于 2019-11-30 14:58:14
当你第一次学习编码时,大部分人都是将数组作为主要数据结构来学习。 之后,你将会学习到哈希表。如果你是计算机专业的,你肯定需要选修一门数据结构的课程。上课时,你又会学习到链表,队列和栈等数据结构。这些都被统称为线性的数据结构,因为它们在逻辑上都有起点和终点。 当你开始学习树和图的数据结构时,你会觉得它是如此的混乱。因为它的存储方式不是线性的,它们都有自己特定的方式存储数据。 定义 树是众所周知的非线性数据结构。它们不以线性方式存储数据。他们按层次组织数据。 树的定义 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。 在任意一颗非空树中: (1) 有且仅有一个 特定的称为根(Root)的结点。 (2)当n>1时,其余结点可分为m(m>0)个 互不相交的有限集 T1、T2、.....、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 下图就符合树的定义: 其中根结点A有两个子树: 我们硬盘的文件系统就是很经典的树形结构。 “树”它具有以下的特点: ①每个节点有零个或多个子节点; ②没有父节点的节点称为根节点; ③每一个非根节点有且只有一个父节点; ④除了根节点外,每个子节点可以分为多个不相交的子树; 树( tree )是被称为结点( node )的实体的集合。结点通过边( edge )连接。每个结点都包含值或数据( value/date )