前序遍历

LeetCode94 二叉树的中序遍历

不羁岁月 提交于 2020-02-09 07:48:04
给定一个二叉树,返回它的 中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ /* 算法思想: 算法思想: 采用递归的思想,即借助系统栈,效率较低。二叉树的前序遍历规则:1. 遍历左子树; 2. 访问根结点; 3. 遍历右子树 */ /* class Solution { private: void rec(TreeNode* root,vector<int> &ret){ if(root != NULL){ rec(root->left,ret); ret.push_back(root->val); rec(root->right,ret); } } public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ret; rec(root,ret); return ret;

递归遍历二叉树

时间秒杀一切 提交于 2020-02-09 00:23:27
#二叉树结点 class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None #二叉树类,创建二叉树和遍历二叉树 class BinaryTree(object): def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self.CreateBinaryTree(Root.RightChild) def PreOrder(self,Root): if Root is not None: self.VisitBinaryTreeNode(Root) self.PreOrder(Root.LeftChild) self.PreOrder(Root.RightChild) def InOrder(self,Root): if Root is not None: self.InOrder(Root

非递归遍历二叉树

旧城冷巷雨未停 提交于 2020-02-08 23:06:54
#类名称:BinaryTreeNode #类说明:定义一个二叉树的结点 #类释义:分别有左孩子LeftChild,右孩子RightChild和数据data class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None class TreeState(object): def __init__(self,BinaryTreeNode,VisitedFlag): self.BinaryTreeNode = BinaryTreeNode self.VisitedFlag = VisitedFlag #类说明:定义一个二叉树 class BinaryTreeNonRecursive(BinaryTreeNode): #创建二叉树的函数 def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self

非线性数据结构——树

微笑、不失礼 提交于 2020-02-08 16:52:52
树 非线性数据结构定义:也就是每个元素可以有多个前驱和后继。树是一种非线性结构。它可以有两种定义。 第一种:树是n(n>=0, n为0时,称为空树 )个元素的集合,它只有 一个特殊的没有前驱的元素 ,这个元素成为树的 根(root) ,而且 树中除了根节点外,其余的元素都只能有一个前驱,可以有0个或者多个后继。 第二种递归定义:树T是n(n>=0,n为0时,称为空树)个元素的集合,它有且只有一个特殊元素根,剩余元素都可以被划分为M个互不相交的集合T1,T2,T3……、Tm,而每一个集合都是树,称为T的子树subtree,同时,子树也有自己的根。 维基百科是这样定义的: 树中的概念 结点: 树中的数据元素,也就是上图中的,A,B,C,D,E,F,G…… 结点的度degree :节点拥有的子树的数目称为度,记作d(v)。 叶子结结: 节点的度为0,称为叶子节点leaf,终端节点,末端节点。 分支结点: 节点的度不为0,称为非终端节点或分支节点。 分支: 节点之间的关系。 内部节点: 除根节点外的分支节点,当然也不包括叶子节点。 树的度: 树内各节点的度的最大值,比如下面这个图D节点的度最大为3,所以树的度数就是3. 孩子(儿子child)节点: 节点的子树的根节点成为该节点的孩子。 双亲(父parent)节点: 一个节点是他各子树的根节点的双亲。 兄弟(sibling)节点:

数据结构之二叉树遍历

允我心安 提交于 2020-02-07 15:50:32
一、树的遍历操作 树的遍历:从根节点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 遍历的实质为将树结构(非线性结构)转换为线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。 前序遍历: 树的前序遍历操作定义为: 若树为空,则空操作返回; 否则 (1)访问根结点;   (2)按照从左到右的顺序前序遍历根结点的每一棵子树 图中树的前序遍历序列为:A B D E H I F C G 树的后序遍历操作定义为: 若树为空,则空操作返回; 否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵ 访问根结点。 图中树的后序遍历序列: D H I E F B G C A 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 图中树的层序遍历序列: A B C D E F G H I 二、二叉树的遍历操作 前序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①访问根结点; ②前序遍历根结点的左子树; ③前序遍历根结点的右子树。 图中二叉树的前序遍历序列:A B D G C E F 中序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①中序遍历根结点的左子树; ②访问根结点; ③中序遍历根结点的右子树。 图中二叉树的中序遍历序列:D G B A E C F 后序(根

二叉树的代码实现 JAVA 版本

こ雲淡風輕ζ 提交于 2020-02-07 13:14:22
本文主要实现二叉树的简单功能: (1)二叉树的生成 (2)二叉树的遍历:前序遍历,中序遍历,后序遍历,层次遍历 (3)二叉树的删除 (3)判断节点是否存在的功能 package ds.tree; import ds.link.Node; import java.util.LinkedList; import java.util.Queue; /** * @author : cuantianhou 2019/12/17 */ public class BinaryTree <T extends Comparable<T>>{ private Node<T> root; private int capacity = 0; public T insert(T data){ /** * Step1: 如果该节点为空,将该节点设置为根节点,父节点为空,返回出入值 * * */ capacity++; if(root == null) { root = new Node<T>(data,null); return root.data; } /** * Step2:从根节点遍历,插入节点比当前节点小,把当前节点设置为左子节点,然后与左子比较, * 插入节点比当前节点大,把当前节点设置为右子节点,然后与右子比较,插入节点和当前节点相等 * 覆盖并返回当前值 **/ //父节点 Node<T>

二叉树遍历

不羁岁月 提交于 2020-02-07 07:06:55
前序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根 假设树节点的定义如下: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 递归版 //前序遍历 void preorderTraversalRecursion(TreeNode *node) { if(!node) return; cout << node->val << " ";//操作当前节点 preorderTraversalRecursion(node->left); preorderTraversalRecursion(node->right); } //中序遍历 void inorderTraversalRecursion(TreeNode *node) { if(!node) return; inorderTraversalRecursion(node->left); cout << node->val << " ";//操作当前节点 inorderTraversalRecursion(node->right); } //后序遍历 void postorderTraversalRecursion(TreeNode

LeetCode 144. 二叉树的前序遍历

自闭症网瘾萝莉.ら 提交于 2020-02-07 07:06:20
给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal 递归: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 13 void process(TreeNode* root,vector<int> &ans) 14 { 15 ans.push_back(root->val); 16 if(root->left) process(root->left,ans); 17 if(root->right) process(root->right,ans); 18 } 19 20 vector<int>

leetcode 144.二叉树的前序遍历

醉酒当歌 提交于 2020-02-06 09:13:34
//解法一:非递归版本 Time:O(n),Space:O(n) /** * 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> preorderTraversal(TreeNode* root) { vector<int> v; stack<TreeNode*> s; if(root!=NULL) { s.push(root); while(!s.empty()) { TreeNode* node=s.top(); s.pop(); v.push_back(node->val); if(node->right!=NULL) s.push(node->right); if(node->left!=NULL) s.push(node->left); } } return v; } }; //解法二:递归版本 //Time:O(n) Space:O(n) /** * Definition for a binary tree node. *

树据结构与算法——二分搜索树 动画演示

…衆ロ難τιáo~ 提交于 2020-02-05 19:05:18
文章目录 一、二分查找法 二分查找法变变种:floor和ceil 二、二分搜索树 实现查找表的比较: 二分搜索树定义 插入元素 查找元素 三、二分搜索树的遍历 二分搜索树的遍历(深度优先遍历) 二分搜索树的层序遍历(广度优先遍历) 四、二分搜索树删除节点 删除最大值,最小值 删除任意节点 附录   二叉搜索树是用来解决查找问题的,在介绍二叉搜索树之前,先学习二分查找法。 一、二分查找法   二分查找法只能对于 有序数列 使用(排序后的数组),在中间找一个元素v如果不是v,这在<v和>v两部分查找,时间复杂度为O(logn),如下图所示: 二分查找代码: // 二分查找法,在有序数组arr中,查找target // 如果找到target,返回相应的索引index // 如果没有找到target,返回-1 template < typename T > int binarySearch ( T arr [ ] , int n , T target ) { // 在arr[l...r]之中查找target int l = 0 , r = n - 1 ; while ( r > l ) { //int mid = (l + r)/2; // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + ( r - l ) / 2 ; //如果刚好找到 if ( arr [