问题描述:s型遍历二叉树,或者反s型遍历二叉树 算法分析:层序遍历二叉树只需要一个队列,因为每一层都是从左往右遍历,而s型遍历二叉树就要用两个栈了,因为每次方向相反. public static void SpiralOrderTraverse(TreeNode t) { Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); stack1.push(t)…
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 1.一个栈用来做push 2.另一个栈用来做pop 3.将push操作的栈的元素放入另一个栈中,实现先进先出 class Solution { public: void push(int node) { stack1.push(node); } int pop() { if(stack2.empty()) { while(!stack1.empty()) { int num = stack1.…
//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()) { TreeNo…
利用两个栈来实现一个队列, 这个问题非经常见.  最关键的是要有好的思路, 至于实现, 那是非常easy的事情了. 在本文中, 也想说说自己的思路, 可是. 我认为用代码来表述思路更符合我的习惯. 也是我的菜, 所以, 只给出代码. 如有须要. 大家能够依据代码来理解思路. OK, 没有必要废话了, 直接上代码: #include <iostream> #include <stack> using namespace std; // 用两个stack实现一个queue, 以int类…
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列可以唯一确定一棵二叉树理由:1.前序遍历数组中的第一个元素就是二叉树的根节点. 2.根节点将中序遍历数组从中间划分为左子树部分和右子树部分. 3.前序遍历数组中的左子树与右子树的长度与中序遍历相同,于是也一分为二. 4.递归. 由二叉树的中序和后序遍历序列可以唯一确定一棵二叉树理由:中序是 访问顺序…
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(preorder).中序(inorder).后序(postorder)遍历有两个常用的方法:一是递归 (recursive),二是使用栈实现的迭代版本(stack+iterative).这两种方法都是O(n)的空间复杂度(递归本身占用stack空 间或者用户自定义的stack),所以不满足要求.(用这两…
先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索"). 对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树. 概念 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree).…
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys greater than the node's key. Both the left and right subtrees must also be binary search…
参照和学习: https://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html 解决的问题:如何使用空间复杂度O(1),来遍历二叉树. 我们通常的办法:是递归或者利用栈的迭代,空间复杂度都为O(logN),虽然已经很完美,但是还有更加美丽和充满艺术感的Morris. Morris解法:首先要面临的问题是,O(1)的空间,遍历的时候怎么回去(常规方法,是利用栈,和递归存储先前信息的能力),我们所知道的二叉树的叶节点,都…
目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问题是没有写二叉树节点和树的模版类的构造实现,和没有具体实现 visit 函数(也没说明,略坑). 只需要前中后序遍历的话很多函数都不需要,此外值得吐槽的一点是,明明 BinaryTreeNode 类里面接口写的很明确,私有成员也都保护起来了,最后却把 BinaryTree 添加为了友元类,这波操作着…