二叉树的创建和遍历-C语言实现


链式存储结构

struct BinaryTreeNode {//数据char data;//左子树BinaryTreeNode *leftChild;//右子树BinaryTreeNode *rightChild;};

三种遍历方式

  • 中序遍历

    1. 中序遍历其左子树
    2. 访问根节点
    3. 中序遍历其右子树
  • 先序遍历(前序遍历)

    1. 访问根节点
    2. 先序遍历其左子树
    3. 先序遍历其右子树
  • 后序遍历
    1. 后序遍历其左子树
    2. 后序遍历其右子树
    3. 访问根节点

树的形状

代码实现

#include <iostream>
#include <stack>
#include<vector>
#include <queue>using namespace std;//起别名
typedef struct BinaryTreeNode *BinaryTree;struct BinaryTreeNode {//数据char data;//左子树BinaryTreeNode *leftChild;//右子树BinaryTreeNode *rightChild;
};/*** 访问二叉树的节点* @param binaryTree*/
void visit(BinaryTree binaryTree) {if (binaryTree) {cout << binaryTree->data << " ";}
}/*** 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据* @param binaryTree*/
void createTree(BinaryTree *binaryTree) {//    abd**fe***cg*h**i**  根据创建二叉树char dataTemp;cin >> dataTemp;//用*来表示该节点的数据为空即该节点为空if ('*' == dataTemp) {*binaryTree = NULL;} else {//先创建该结点*binaryTree = (BinaryTree) (malloc(sizeof(BinaryTreeNode)));//前序遍历:数据->左子树->右子树(*binaryTree)->data = dataTemp;createTree(&(*binaryTree)->leftChild);createTree(&(*binaryTree)->rightChild);}
}/*** 中序遍历二叉树(递归算法)* @param binaryTree*/
void InOrderTraversal(BinaryTree binaryTree) {if (binaryTree) {InOrderTraversal(binaryTree->leftChild);visit(binaryTree);InOrderTraversal(binaryTree->rightChild);}
}/*** 中序遍历(非递归)* @param binaryTree*/
void InOrderTraversalNO(BinaryTree binaryTree) {if (binaryTree == NULL) {return;}//初始化栈stack<BinaryTreeNode *> myStack;BinaryTree temp = binaryTree;while (temp != NULL || !myStack.empty()) {//根指针进栈,遍历左子树if (temp != NULL) {myStack.push(temp);temp = temp->leftChild;} else {//根指针退栈,访问根节点,遍历右子树temp = myStack.top();myStack.pop();visit(temp);temp = temp->rightChild;}}
}/*** 先序遍历二叉树(递归算法)* @param binaryTree*/
void PreOrderTraversal(BinaryTree binaryTree) {if (binaryTree) {visit(binaryTree);PreOrderTraversal(binaryTree->leftChild);PreOrderTraversal(binaryTree->rightChild);}
}/*** 先序遍历(非递归)* @param binaryTree*/
void PreOrderTraversalNO(BinaryTree binaryTree) {if (binaryTree == NULL) {return;}//初始化栈stack<BinaryTreeNode *> myStack;BinaryTree temp = binaryTree;while (temp != NULL || !myStack.empty()) {//根指针进栈,遍历左子树if (temp != NULL) {visit(temp);myStack.push(temp);temp = temp->leftChild;} else {//根指针退栈,访问根节点,遍历右子树temp = myStack.top();myStack.pop();temp = temp->rightChild;}}
}/*** 后序遍历二叉树(递归算法)* @param binaryTree*/
void PostOrderTraversal(BinaryTree binaryTree) {if (binaryTree) {PostOrderTraversal(binaryTree->leftChild);PostOrderTraversal(binaryTree->rightChild);visit(binaryTree);}
}/** 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,* 先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;* 或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。* 若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,* 左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。*/
void PostOrderTraversalNO(BinaryTree binaryTree) {if (binaryTree == NULL) {return;}BinaryTree temp = binaryTree;stack<BinaryTreeNode *> myStack;//当前结点BinaryTree current;//前一次访问的结点BinaryTree pre = NULL;myStack.push(binaryTree);while (!myStack.empty()) {current = myStack.top();if ((current->leftChild == NULL && current->rightChild == NULL) ||(pre != NULL && (pre == current->leftChild || pre == current->rightChild))) {//如果当前结点没有孩子结点或者孩子节点都已被访问过visit(current);myStack.pop();pre = current;} else {if (current->rightChild != NULL) {myStack.push(current->rightChild);}if (current->leftChild != NULL) {myStack.push(current->leftChild);}}}
}char ch;
bool flag;void findpath(BinaryTree binaryTree, char x, vector<char> &v) {if (binaryTree == NULL) {return;}v.push_back(binaryTree->data);if (binaryTree->data == x) {flag = 1;for (int i = 0; i < v.size(); i++) {putchar(v[i]);}putchar(10);return;}findpath(binaryTree->leftChild, x, v);findpath(binaryTree->rightChild, x, v);v.pop_back();
}/*** 二叉树的层序遍历* @param binaryTree*/
void levelOrderTraversal(BinaryTree binaryTree) {if (binaryTree == NULL) {return;}//定义使用的队列queue<BinaryTreeNode *> myQueue;BinaryTree temp = binaryTree;//根节点入队myQueue.push(temp);//队列不为空的时候循环while (!myQueue.empty()) {//队头元素出队temp = myQueue.front();myQueue.pop();//访问temp指向的节点visit(temp);//左子树不为空,入队左子树if (temp->leftChild != nullptr) {myQueue.push(temp->leftChild);}//右子树不为空,入队右子树if (temp->rightChild != nullptr) {myQueue.push(temp->rightChild);}}
}/*** 获取双分支节点的个数* @param binaryTree*/
int PreOrderTraversalGet2(BinaryTree binaryTree) {if (binaryTree == NULL) {return 0;}int number = 0;//初始化栈stack<BinaryTreeNode *> myStack;BinaryTree temp = binaryTree;while (temp != NULL || !myStack.empty()) {//根指针进栈,遍历左子树if (temp != NULL) {if (temp->rightChild != NULL && temp->leftChild != NULL) {number++;}myStack.push(temp);temp = temp->leftChild;} else {//根指针退栈,访问根节点,遍历右子树temp = myStack.top();myStack.pop();temp = temp->rightChild;}}return number;
}/*** 求二叉树的深度* @param binaryTree* @return*/
int postOrderGetHeight(BinaryTree binaryTree) {if (binaryTree) {//求左子树的深度int leftHeight = postOrderGetHeight(binaryTree->leftChild);//求右子树的深度int rightHeight = postOrderGetHeight(binaryTree->rightChild);int max = leftHeight > rightHeight ? leftHeight : rightHeight;return max + 1;} else {return 0;}
}/*如果需要构建一颗如下所示的二叉树:AB            CD      F    G       IE         H
输入ABD**FE***CG*H**I**即可创建该二叉树**/
int main() {BinaryTree binaryTree = NULL;createTree(&binaryTree);cout << "中序遍历:(递归)" << endl;InOrderTraversal(binaryTree);cout << endl;cout << "中序遍历:(非递归)" << endl;InOrderTraversalNO(binaryTree);cout << endl;cout << "先序遍历:(递归)" << endl;PreOrderTraversal(binaryTree);cout << endl;cout << "先序遍历:(非递归)" << endl;PreOrderTraversalNO(binaryTree);cout << endl;cout << "后序遍历:(递归)" << endl;PostOrderTraversal(binaryTree);cout << endl;cout << "后序遍历:(非递归)" << endl;PostOrderTraversalNO(binaryTree);cout << endl;cout << "层序遍历:" << endl;levelOrderTraversal(binaryTree);cout << endl;cout << "二叉树的深度:" << postOrderGetHeight(binaryTree) << endl;cout << "二叉树的中双分支节点的个数为:" << PreOrderTraversalGet2(binaryTree) << endl;char x;cout << "请输入查找路径字符:";cin >> x;vector<char> v;cout << "根节点到" << x << "的路径为:";findpath(binaryTree, x, v);cout << endl;return 0;
}

二叉树的创建和遍历-C语言实现相关推荐

  1. c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)

    C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...

  2. C语言二叉树的创建与遍历

    二叉树的创建与遍历 文章目录 二叉树的创建与遍历 前言 一.二叉树的结构 二.二叉树创建和三种遍历 1. 2.前序遍历 3.中序遍历 4.后序遍历 5.测试代码 总结 前言 二叉树(binary tr ...

  3. python二叉树的创建与遍历

    二叉树的基本概念: 一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推 二叉树的深度(高度):指的是二叉树中的最大叶子结点所在的层.二叉树的深度 ...

  4. 二叉树的后序遍历(C语言)

    首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子 ...

  5. C语言——二叉树的创建与遍历

    二叉树 内容 实现二叉树的创建算法与中序列遍历算法.步骤如下: 将二叉树模拟成完全二叉树,从根结点开始对所有结点进行编号,编号从1开始,在运行过程中输入结点对应的编号和值,最后以编号i=0,结点值x= ...

  6. 二叉树的中序遍历(C语言)

    我们从两个方向讲解二叉树的中序遍历(递归+迭代) 一.递归 思想: 从根节点开始向其的左孩子遍历,一直访问每个节点的左孩子,当其走到NULL时返回,返回时记录每个节点的数值,然后访问该节点的右孩子,如 ...

  7. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  8. [******] 树问题:普通二叉树的创建与遍历

    1. 二叉树的创建 String pre_str = "1,2,4,8,-1,-1,9,-1,-1,5,-1,-1,3,6,-1,10,-1,-1,7,-1,-1";//先序输入S ...

  9. 2.12_binary_tree_二叉树的创建和遍历

    创建二叉树 - 节点链接法 (很笨) class BiTreeNode(object):"""节点链接法"""def __init__(se ...

最新文章

  1. laravel 中间件不生效_laravel中间件实战(luke)
  2. 在虚拟机上linux系统上上网
  3. 读书感悟 1 孙子兵法虚实篇(最重要的事情只有一件)
  4. sklearn自学指南(part1)--Machine Learning in Python
  5. 1073 多选题常见计分法 (20 分)
  6. csv格式清洗与转换python_实例详解Python中 CSV格式清洗与转换
  7. CheckBox控件和数据库的关联
  8. 完美安装ubuntu
  9. 【编程题】省份城市的三级联动
  10. 2021年遥感类SCI期刊JCR分区/中科院分区排名与影响因子汇总
  11. 什么是OFD格式文档?一文教你读懂OFD格式文档
  12. 使用QEMU搭建ARM64实验环境
  13. 【直播礼物特效】vapxtool简介(一)(企鹅电竞)
  14. 机器学习如何帮助Caesars大涨邮件绩效
  15. 新手如何让淘宝店铺的销量提升, 该如何做!
  16. 简单的C语言代码实现快速排序
  17. 逆向工程的几种应用方向
  18. 在html如何设计页面大小,网页设计中页面尺寸标准
  19. 解密QQ旋风和迅雷以及快车链接地址
  20. 浅谈交易开拓者程序化

热门文章

  1. TCP/IP协议的TCP握手协议
  2. Properties作为Map集合的使用
  3. Stream流的收集操作
  4. SpringMVC的请求-获得请求参数-获得请求头信息
  5. DoubleCheck双重检查实战及原理解析
  6. goland设置goroot_go环境搭建-goland使用、gopath、go命令
  7. 动态数组vector
  8. Allegro光绘的导出
  9. 共模干扰和差模干扰(图解)---摘自: 硬件十万个为什么
  10. exit()函数学习