非递归前序遍历

问题:对一个二叉搜索树进行前序遍历,打印出每个结点的值,但是不能使用递归。

解题:

(1)递归可以用迭代来替代

(2)了解递归的前序遍历中发生了什么:①打印出根节点(或子树根节点)的值;②对左子树进行前序遍历;③对右子树进行前序遍历。

递归隐式地使用了一个数据结构栈来存放调用栈上的数据。实际上,递归调用用于隐式地在栈上存储右子树的地址,因此左子树遍历完后,可以继续遍历右子树。每次打印             一个结点,并移动到它的左子树上,它的右子树会首先存放在一个栈上,当没有任何子树时,从一个递归调用中返回,也就是从栈上弹出一个右子树结点。这个过程一直持

续到栈空为止。

(3)代码实现(核心代码)

结点的存储结构:

struct Node
{
	int data;//数据域
	Node* left;//指向左孩子的指针
	Node* right;//指向右孩子的指针
};

思路一:

与其分别实现左子树和右子树结点的情况,不如将两个结点全部压入栈。这里就要考虑入栈的顺序:将右结点先压入栈,然后是左结点。

void preorderTraversal1(){
		stack<Node*> s;
		s.push(root);
		while (s.size() > 0){
			Node* cur = s.top();
			s.pop();
			cout << cur->data << " ";
			Node* n = cur->right;
			if (n != NULL){
				s.push(n);
			}
			n = cur->left;
			if (n != NULL){
				s.push(n);
			}
		}
		cout << endl;
	}

思路二:

程序开始时先将根结点入栈,再弹出结点A栈打印。并将弹出栈的结点A的右结点入栈,并将A移动指向它的左节点。重复以上过程直到栈空。

void preorderTraversal2(){
		stack<Node*> s;
		Node* tmp = root;
		s.push(tmp);
		while (s.size() > 0){
			tmp = s.top();
			s.pop();
			while (tmp != NULL){
				cout << tmp->data << " ";
				if (tmp->right != NULL){
					s.push(tmp->right);
				}
				tmp = tmp->left;
			}
		}
	}

ps:并非全部原创,是阅读《程序员面试攻略》第三版的读书笔记。

时间: 2024-11-08 09:48:08

非递归前序遍历的相关文章

【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】

[144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,2,3]. Note: Recursive solution

非递归前序遍历二叉树

#include<stdio.h> #include<stdlib.h> //定义结构体 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiNode,* pBiNode; pBiNode stack[100]; void later(pBiNode * p) //前序创建树 { char ch; scanf("%c",&ch); if(ch=='#') *p=NU

Leetcode: Binary Tree Preorder Traversal(二叉树非递归前序遍历)

题目: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,2,3]. Note: Recursive solution is trivial, could you do it iteratively? 二叉树的前序遍历 先看递归的写法(C++): /** * Definition f

二叉树的非递归前序遍历

//好久不用C++许多语法细节都忘记了...费了九牛二虎之力还搞的那么复杂,Anyway,下午把前序遍历给写出来了,还是有点成绩的... #include<iostream> #include<stack> using namespace std; typedef int dataType; typedef struct BiTree { dataType data; BiTree *lchild; BiTree *rchild; }BiTree,*treePoint; treeP

144.Binary Tree Preorder Traversal(非递归前序遍历)

Given a binary tree, return the preorder traversal of itsnodes' values. For example: Given binary tree {1,#,2,3}, 1 \ 2 / 3 return [1,2,3]. Note: Recursive solution istrivial, could you do it iteratively? HideTags Tree Stack #pragma once #include<ios

二叉树遍历(递归、非递归,层次遍历(从上往下))

递归算法 void preorder1(Node *root) //递归前序遍历 { if (root == NULL) return; printf("%d ", root->val); preorder1(root->left); preorder1(root->right); } void inorder1(Node *root) //递归中序遍历 { if (root == NULL) return; inorder1(root->left); prin

二叉树非递归后缀遍历

二叉树的遍历方法可分为深度优先和广度优先两种.当中深度优先遍历适合使用栈来辅助实现.广度优先则使用队列.由于栈的先进后出和队列的先进先出特点正好符合遍历顺序的要求. 深度优先遍历一般又分为前序遍历,中序遍历.后序遍历,对于一颗树来说,前序.中序.后序针对的都是它的根节点.当中前序遍历訪问顺序是:根节点-->左节点-->右节点,中序遍历訪问顺序是:左节点-->根节点-->右节点,兴许遍历訪问顺序是:左节点-->右节点-->根节点.二叉树的结构是递归的,因此非常适合使用递归

每天刷个算法题20160518:非递归二叉树遍历

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502254 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在贴点代码. 2002年我初中二年级,开始学习BASIC语言.2004年中考之后,开始参加NOIP,系统学习算法.一直非常喜欢算法,但工作后几乎不再碰这些东西.现在准备重新捡起来. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofe

非递归实现遍历二叉树

非递归实现二叉树主要利用queue和stack的特点,对于层次遍历二叉树主要运用queue队头出,队尾插入,先进先出的特点,先将根插入队尾,然后输出队头的元素,同时将队头的左子树和右子树元素插入队尾,依次输出输出队头的元素,同时将队头的左子树和右子树元素插入队尾,直到队列为空. void levelorder() { queue<BinaryTreeNode<T> *>s; if (_root == NULL) return; s.push(_root); while (!s.em