二叉树遍历——先序遍历

遍历顺序如下图:依次遍历左孩子,到头了就转向右孩子

#include<iostream>
#include<stack>
using namespace std;//排序二叉树有如下性质
//若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
//若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
//左、右子树也分别为二叉排序树struct BT//定义一个BT结构的节点,每一个BT结构的节点都具有val值,和指向组偶有孩子的指针
{int val;BT* left;//左指针BT* right;//右指针};
struct Tree//定义一个树结构,每个树都有BT类型的节点指向的根
{BT *root;
};void insert(Tree* tree, int val)//形参为指向tree的指针
{BT* temp, *newnode;newnode = new BT;//为newnode开辟一个新的BT空间newnode->val = val;newnode->right = NULL;//初始化为一个空newnode->left = NULL;//if (tree->root==NULL)//如果现在的树为空的树,当前的点为根{tree->root = newnode;}else{temp = tree->root;//temp从根节点开始判断要插入的位置,将当前值与temp值比较,while (NULL != temp)//若大于temp,则判断temp的右儿子存不存在,存在就重新赋值temp,继续进行比较{if (temp->val<newnode->val){if (temp->right==NULL){temp->right = newnode;return;}else{temp = temp->right;}}else{if (temp->left == NULL){temp->left = newnode;return;}else{temp = temp->left;}}}}
}//先序访问
void preorder(BT* ptr)//先序访问 , 根左右,即先访问根节点,再访问左结点,最后访问右结点
{if (ptr != NULL)//递归调用→转化为迭代形式{std::cout << ptr->val << " ";preorder(ptr->left);    preorder(ptr->right);}
}
//先序访问,迭代实现
void preorder_1(BT* ptr)//参数为根结点
{stack<BT*>s;//辅助栈s.push(ptr);while (!s.empty()){BT* current;current = s.top();std::cout << "当前结点的值为: " << current->val << endl;//访问当前值s.pop();//弹出if(current->right!=NULL)s.push(current->right);if (current->left != NULL)s.push(current->left);}
}
//新迭代算法leftbranch
void leftbranch(BT* ptr, stack<BT*>&s)
{BT* current = ptr;while (current!=NULL){std::cout <<"当前节点为:  " <<current->val;if (current->right != NULL)s.push(current->right);current = current->left;}
}
void preorder_2(BT* ptr)
{BT* current = ptr;stack<BT*>st;while (true){leftbranch(current, st);if (st.empty())break;current = st.top();st.pop();}
}int main()
{Tree tree;//定义一个类型为Tree的treeBT* b1 = new BT;//由于树的根结点为指向BT的指针,故需要b1->val =10;b1->left = new BT;b1->left->val = 9;b1->left->left = NULL;b1->left->right = NULL;b1->right = new BT;b1->right->val = 11;b1->right->left = NULL;b1->right->right = NULL;tree.root = b1;preorder(tree.root);std::cout << endl;        Tree* to_tree = &tree;insert(to_tree, 20);insert(to_tree, 7);insert(to_tree, 10);insert(to_tree, 34);insert(to_tree, 13);preorder_1(tree.root);std::cout << endl;preorder_2(tree.root);std::cout << endl;system("pause");return 0;
}

二叉树遍历——先序遍历相关推荐

  1. 刻意练习:LeetCode实战 -- 二叉树的后序遍历

    背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...

  2. 二叉树的先序遍历(非递归)

    虽然递归简单理解,但是用递归内存开销大,耗时长,性能往往不如非递归方式 所以这里通过栈,用非递归方法实现二叉树的先序遍历 二叉树的存储结构定义: typedef struct node{int dat ...

  3. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java

    <LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...

  4. 树结构练习——排序二叉树的中序遍历(二叉搜索树)

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...

  5. 1.二叉树的中序遍历

    题目:给出一棵二叉树,返回其中序遍历 /** * Definition of TreeNode:  * class TreeNode {  * public:  *     int val;  *   ...

  6. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  7. LeetCode-二叉树-94. 二叉树的中序遍历

    描述 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root ...

  8. 树结构练习——排序二叉树的中序遍历

    树结构练习--排序二叉树的中序遍历 Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的 ...

  9. LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  10. lintcode:二叉树的中序遍历

    题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1\2/3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 Java ...

最新文章

  1. hadoop 提高hdfs删文件效率----hadoop删除文件流程解析
  2. 法大大刘谦:法务智能化创新实践与行业趋势
  3. Programming in Scala 3rd edition中的一个问题
  4. DPDK 数据包捕获基本流程(十六)
  5. 【Android Gradle】安卓应用构建流程 ( 资源文件编译 )
  6. echart 坐标数字间隔_用LaTeX优雅地绘制数字电路
  7. Mysql数据库(四)——mysql索引相关知识
  8. simulink和psim仿真结果不同_CAE仿真分析规范是什么?涨知识啦!
  9. LD_LIBRARY_PATH should not contain the current directory
  10. java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)
  11. prettytensor 的使用
  12. EMI (电磁干扰)
  13. k8s部署nexus3
  14. Lync 小技巧-52-Lync 2013-不加域-客户端-2-导入-证书-信任链
  15. 警惕!全球酒店门锁很容易受到黑客攻击
  16. 用Keil uVision5创建纯汇编语言的STM32工程
  17. 标注与注记的区别和联系
  18. 阿里云短信服务(申请与代码)
  19. 宾得rtk手簿说明书_那曲宾得RTK操作说明
  20. 【OR】二次规划(2):SCA方法

热门文章

  1. mysql 5.0.8 下载_mysql-connector-
  2. Android 安装apk流程,Android PMS(二)-Apk安装流程
  3. 项目管理工具——项目开发者工具
  4. 【ROS-Navigation】—— DWA路径规划算法解析
  5. Java入门第一步---配置环境、安装工具(超级详细)
  6. 2016 年最新苹果开发者账号注册流程详解(个人账号篇)
  7. keras.metrics有五种accuracy
  8. 生活中软件易用性的例子_多用“举出例子”“比如说”,来进行生活中的语言交流...
  9. 如何遍历一个二叉树——非递归实现
  10. 选择器:id与name