树结构的定义,几种遍历方法
来源:互联网 发布:推理小说推荐 知乎 编辑:程序博客网 时间:2024/05/18 00:47
1、数据结构中树结构体的定义:
typedef struct BinaryTreeNode{int data;struct BinaryTreeNode *lchild;struct BinaryTreeNode *rchild;}* BinTreeRoot;定义了BinaryTreeNode这个结构体是树中的一个节点。然后又使用typedef将BinaryTreeNode的指针封装为BinTreeRoot类型,相当于是
typedef struct BinaryTreeNode * BinTreeRoot.
2、给定一个指向根节点的指针,树的遍历过程
(1)先序遍历(先根遍历)
递归实现:
void preOrder(BinaryTreeNode *pRoot){if(pRoot == NULL)return;else{cout << pRoot->data << " ";preOrder(pRoot->lchild);preOrder(pRoot->rchild);}}
void preOrderStack(BinaryTreeNode *pRoot){if (pRoot == NULL)return;stack<BinaryTreeNode *>s;s.push(pRoot);while (!s.empty()){BinaryTreeNode *temp = s.top();s.pop();cout << temp->data << " ";if (temp->rchild != NULL)s.push(temp->rchild);if (temp->lchild != NULL)s.push(temp->lchild);}}
(2)中序遍历(中根遍历)
递归实现:
void inOrder(BinaryTreeNode *pRoot){if (pRoot == NULL)return;else{inOrder(pRoot->lchild);cout << pRoot->data << " ";inOrder(pRoot->rchild);}}
借助于栈实现:
void inOrderStack(BinaryTreeNode *pRoot){if (pRoot == NULL)return;BinaryTreeNode *p = pRoot;stack<BinaryTreeNode *>s;s.push(p);//将根节点入栈BinaryTreeNode *temp = p->lchild;while (temp != NULL)//将这棵树左边的入栈{s.push(temp);temp = temp->lchild;}while (!s.empty()){temp = s.top();s.pop();cout << temp->data << " ";if (temp->rchild != NULL){temp = temp->rchild;while (temp){s.push(temp);temp = temp->lchild;}}}}
(3)后序遍历(后根遍历)
递归实现
void postOrder(BinaryTreeNode *pRoot){if (pRoot == NULL)return;else{postOrder(pRoot->lchild);postOrder(pRoot->rchild);cout << pRoot->data << " ";}}
(4)层次遍历(广度优先遍历)
void herOrder(BinaryTreeNode *root){if (root == NULL)return;queue<BinaryTreeNode *>q;q.push(root);while (!q.empty()){BinaryTreeNode *temp = q.front();q.pop();cout << temp->data << " ";if (temp->lchild)q.push(temp->lchild);if (temp->rchild)q.push(temp->rchild);}}
把树看做图,相当于图中广度优先遍历。使用队列的先进先出的性质。在图的广度优先遍历中需要设定一个指示节点是否进过队列的bool变量。如果进过队列就置为true,如果没有进过队列为false。
广度优先遍历的思想就是:出对一个元素,将与出对元素相邻并且未进过队列的元素进队这样一个过程。
阅读全文
0 0
- 树结构的定义,几种遍历方法
- 图的结构定义及遍历方法
- C语言中定义结构体的几种方法
- C语言中定义结构体的几种方法
- 二叉树的几种遍历方法
- 二叉树的几种遍历方法
- 几种结构体定义的区别
- 结构体定义的几种方式
- 二叉树树的几种遍历方法
- 非递归方式遍历二叉树的几种方法
- 关于二叉树的几种遍历方法
- 关于二叉树的几种遍历方法
- 关于二叉树的几种遍历方法
- 关于二叉树的几种遍历方法
- 关于二叉树的几种遍历方法
- 遍历页面控件的几种方法
- 遍历Hashtable 的几种方法
- 遍历进程名的几种方法
- Selenium学习笔记18-问题汇总
- 自动化测试
- 第 13 章 红黑树
- Spring MVC RedirectAttributes的用法
- linux NVMe驱动总结
- 树结构的定义,几种遍历方法
- 我理解的xpath实战应用
- 使用sphinx快速生成Python API 文档
- 我的 第一个微信小程序
- C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)
- 使用循环CAS实现原子操作
- 优雅解决The android gradle plugin version 3.0.0-alpha1 is too old, update to the latest version
- 机器视觉学习笔记(4)——单目摄像机标定参数说明
- 用HTML5构建一个流程图绘制工具