S型顺序遍历二叉树(c++实现)

//1.s型顺序访问二叉树,默认先左后右;利用两个栈来实现;如果先右后左的话,改变一下入栈的顺序就行
//2.注意s1 s2插入栈的顺序是不同的
void S_LevelOrderPrint(TreeNode t)
{
    stack<TreeNode> s1;
    stack<TreeNode> s2;
    s1.push(t);
    while(!s1.empty() || !s2.empty())
    {
        if(!s1.empty())
        {
            while(!s1.empty())
            {
                TreeNode tn = s1.top();
                cout<<tn.val<<"";
                if(tn.right != null)
                {
                    s2.push(tn.right);
                }
                if(tn.left != null)
                {
                    s2.push(tn.left);
                }
            }
        }
        else
        {
            while(!s2.empty())
            {
                TreeNode tn = s2.top();
                cout<<tn.val<<" ";
                if(tn.left != null)
                {
                    s1.push(tn.left);
                }
                if(tn.right != null)
                {
                    s1.push(tn.right);
                }
            }
        }

    }
}

  

时间: 2024-10-11 13:38:23

S型顺序遍历二叉树(c++实现)的相关文章

LeetCode 102 Binary Tree Level Order Traversal(二叉树的层级顺序遍历)(*)

翻译 给定一个二叉树,返回按层级顺序遍历的每个节点的值. 从左到右,逐层遍历. 例如: 给定一个二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 返回它的层级顺序遍历结果为: [ [3], [9,20], [15,7] ] 翻译 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For

数据结构(C实现)------- 遍历二叉树

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 根据二叉树的的递归定义可知,二叉树是由3个基本单元组成,根结点.左子树和右子树,因此,若能依次遍历这三部分,便是遍历了整个二叉树.假如以L.D.R分别表示遍历左子树.访问根结点和遍历右子树,则可能有DLR.LDR.LRD.DRL.RD

12.遍历二叉树与二叉树的建立

一.遍历二叉树 1.定义 二叉树的遍历(travering binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 2.前序遍历 (1)规则:若二叉树为空,则空操作返回.否则,先访问根结点,然后前序遍历左子树,再前序遍历右子树. (2)实例 前序遍历结果为:A BDGH CEIF 分析:当最先访问根结点后,然后前序遍历左子树.当访问根的左子树时,这里"前序遍历"即我们将B假设为左子树的根来遍历. (3)算法 从二叉树定义

【转载】Morris遍历二叉树 &amp; BST(二叉搜索树) Traverse &amp; 空间O(1) 时间O(n)

因为做一道Leetcode的题目(前面博客有:link),需要用Space O(1)空间复杂度来中序遍历树, 看了Discuss,也上网搜了一下,发现空间O(1)可以用 Morris遍历的方法.方法介绍如下: http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html其中,中序遍历和前序遍历比较方便解决: 通常,实现二叉树的前序(preorder).中序(inorder).后序(postorder)遍历有两个常用

【转】更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章.可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方法? 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.

非递归遍历二叉树的前序中序后序

/** * 二叉树先序遍历,非递归算法 * 1.申请一个新的栈,记为stack.然后将头节点head压入stack中. * 2.从stack弹出栈顶节点,记为cur,然后打印cur节点的值,再将cur右孩子(不为空) * 压入stack中,最后将cur的左孩子(不为空)压入stack中 * 3.不断重复步骤2,直到stack为空,全部过程结束. * @param head */ public void preOrderNoRecur(Node head){ System.out.print("非

SpiralOrderTraverse,螺旋遍历二叉树,利用两个栈

问题描述:s型遍历二叉树,或者反s型遍历二叉树 算法分析:层序遍历二叉树只需要一个队列,因为每一层都是从左往右遍历,而s型遍历二叉树就要用两个栈了,因为每次方向相反. public static void SpiralOrderTraverse(TreeNode t) { Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); stack1.push(t)

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

数据结构学习笔记(四)---遍历二叉树

遍历二叉树   二叉树是一种非线性的数据结构.所谓的遍历二叉树就是按某种顺序访问二叉树中的每个节点,要求每个节点被访问一次且仅一次. 遍历操作实际上是将非线性结构线性化过程,其结果为线性序列.   二叉树的操作 (1)先序遍历---结束的条件是二叉树是否为空 TLR 先访问根节点: 再先序访问左子树: 再先序访问右子树. (2)中序遍历---结束的条件是二叉树是否为空  LTR 先中序遍历左子树: 再访问根节点: 再中序遍历右子树. (3)后序遍历---结束的条件是二叉树是否为空  LRT 先后