【Tree】二叉树先序遍历 迭代 & 递归

  1 /***************************
  2 https://leetcode.com/problems/binary-tree-preorder-traversal/
  3 @date 2015.5.13
  4 @description
  5 用非递归方法对二叉树进行先序遍历
  6 借助辅助栈
  7 每次先访问根节点,把节点压入栈,再转向其左孩子,直至左子树的左孩子为空,依次将栈顶元素出栈,转向右孩子。
  8
  9
 10 ****************************/
 11
 12 #include <iostream>
 13 #include <stack>
 14 #include <vector>
 15
 16 using namespace std;
 17
 18 struct TreeNode{
 19     int val;
 20     TreeNode *left, *right;
 21     TreeNode(int x): val(x), left(NULL), right(NULL) {}
 22 };
 23
 24 class Solution{
 25 public:
 26     vector<int> preorderTraversal(TreeNode* root) {
 27         stack<TreeNode *> s;
 28         vector<int> res;
 29         if (!root)
 30             return res;
 31
 32         while (root != NULL || !s.empty()){
 33             while (root != NULL){
 34                 res.push_back(root->val);
 35                 s.push(root);
 36                 root = root->left;
 37             }
 38
 39             if (!s.empty()){
 40                 root = s.top();
 41                 s.pop();
 42                 root = root->right;
 43             }
 44         }
 45         return res;
 46     }
 47 };
 48
 49
 50 // 第二种方法迭代先序遍历二叉树
 51 vector<int> preorderTraversal(TreeNode *root){
 52     vector<int> res;
 53     if (!root)
 54         return res;
 55     stack<TreeNode *> s;
 56     s.push(root);
 57     while (!s.empty()){
 58         TreeNode *temp = s.top();
 59         s.pop();
 60         res.push_back(temp->val);
 61         if (temp->right) s.push(temp->right); // 先对右孩子入栈
 62         if (temp->left) s.push(temp->left);
 63     }
 64     return res;
 65 }
 66
 67 TreeNode *insert(TreeNode *root, int data){
 68     TreeNode *ptr = root;
 69     TreeNode *tempNode; // 存储的是插入节点的父节点
 70     TreeNode *newNode = new TreeNode(data);
 71
 72     if (ptr == NULL)
 73         return newNode;
 74     else{
 75         while (ptr != NULL){
 76             tempNode = ptr;
 77             if (ptr->val >= data){
 78                 ptr = ptr->left;
 79             }else{
 80                 ptr = ptr->right;
 81             }
 82         }
 83         if (tempNode->val >= data){
 84             tempNode->left = newNode;
 85         }else{
 86             tempNode->right = newNode;
 87         }
 88     }
 89     return root;
 90 }
 91
 92 // 递归先序遍历二叉树
 93 void travPre(TreeNode *root){
 94     if (!root) return;
 95     cout << root->val << " ";
 96     travPre(root->left);
 97     travPre(root->right);
 98 }
 99
100
101 int main(){
102     TreeNode *root = NULL;
103     int temp = 0;
104     cin >> temp;
105     while (temp != 0){ // 以0结尾(输入0终止)
106         root = insert(root, temp);
107         cin >> temp;
108     } // 创建一棵二叉树
109
110     // 递归先序遍历
111   //  travPre(root);
112     Solution a;
113     vector<int> res = preorderTraversal(root);
114     for (vector<int>::iterator it = res.begin(); it != res.end(); ++it)
115         cout << *it << " ";
116
117 }
时间: 2024-12-23 03:15:43

【Tree】二叉树先序遍历 迭代 & 递归的相关文章

二叉树中序遍历非递归写法

中序遍历比前序要稍微复杂些,我也先用手写理出思路 代码写的和书上的一比...感觉麻烦了好多,但毕竟是自己理的思路不容易忘,所以还是贴自己的 void inOrder_stack(BiTree T){ printf("\n非递归中序遍历结果:\n"); initStack(&sqStack); BiTree p=T,l;//l用于保存上次的输出 push(&sqStack,p); while(!stackEmpty(sqStack)){ getTop(&sqSta

leetcode 二叉树中序遍历的递归和非递归实现

Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3},    1          2     /    3 return [1,3,2]. /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode

二叉树中序遍历迭代解法——求解BST中第k小元素

飞艇公式规律[一对一教导扣2901583663][长久盈利轻松上岸]胜率95%,已助上千人成功翻盘,欢迎增加,沟通交流!如果你没过硬的基础,没有专业计划,没有实际规划,而是盲目**的话,注定你就在亏钱,但是如果是有计划有规律有规划的话就另当别论,可以说是投资,往往稳定心理的投资是有稳定的回报的.简单总结以下几点:1.资金投资要讲究,合理分配是可以得到回报的.2.玩法要专一,往往一在你换掉之前的玩法的时候就出了.3.心理要稳定,该出手就出手,别犹犹豫豫的,那样会把你给拖垮的.4. 别去依赖什么必胜

Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树后序遍历的递归与非递归实现 * * @author wl * */ public class BitreePostOrder { // 后序遍历的递归实现 public static void biTreePostOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreePostOrderByRe

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

【LeetCode-面试算法经典-Java实现】【094-Binary Tree Inorder Traversal(二叉树中序遍历)】

[094-Binary Tree Inorder Traversal(二叉树中序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the inorder traversal of its nodes' values. 题目大意 对一棵二叉树进行中序遍历. 解题思路 解法一:递归实现,解法二:迭代实现. 代码实现 二叉树结点类 public class TreeNode { int val; TreeNod

144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)

题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: 1 class Solution { 2 public: 3 vector<int> preorderTraversal(TreeNode* root) { 4 vector<int> ans; 5 if(root){ 6 TreeNode* temp; 7 stack<TreeNode*> s; //利用栈,

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很