二分搜索树的遍历
来源:互联网 发布:mac 安装virtualbox 编辑:程序博客网 时间:2024/06/04 18:33
对于一棵二叉树来说,如果我们想要把这棵树中的所有节点都给遍历一遍,那么我们就需要了解二叉树的遍历方式。
二叉树的遍历方式分为以下三种:
二叉树的一个简单的结构如下图所示:
对于其中的“前”。“中”,“后”,我们都可以理解为是根节点的访问顺序。
遍历时,我们分为三个阶段:前 中 后
对于前序遍历来说:也就是在前阶段访问根节点,中阶段访问左节点,后阶段访问右节点。(即根->左->右)
对于中序遍历来说:在中阶段访问根节点,前阶段访问左节点,后阶段访问右节点。(即左->中->右)
对于后序遍历来说:在后阶段访问根节点,前阶段访问左节点,中阶段访问右节点。(即左->右->根)
以下是相应的遍历代码:
前序遍历:
//以前序遍历来遍历以root为根节点的二叉树 void preorder(node*node){ if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止 cout<<node->key<<' ';//前阶段 preorder(node->left);//中阶段 preorder(node->right);//后阶段 } }
//中序遍历以node为根的二叉树 void inorder(node*node){ if(node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止 inorder(node->left); cout << node->key << ' '; inorder(node->right); } }
后序遍历:
//以后序遍历的方式遍历以root为根的二叉树 void postorder(node*node){ if (node!=NULL) {//切记一定不能遗忘if判定条件,否则遍历不会停止 postorder(node->left); postorder(node->right); cout<<node->key<<' '; } }
对于需要遍历一个二叉树做一定的事情的时候,我们用前序遍历就够了,但是中序遍历和后序遍历也有他们存在的意义。
因为中序遍历的定义,先访问左子树,后根,然后访问右子树,而二叉树的结构特点为根左边的左子树一定小于根,根右边的右子树一定大于根。因此我们按照中序遍历的出来的顺序刚好是从小排到大的。
对于后序遍历来说,因为后序遍历是最后访问根的,而对于二叉树的释放来说,首先得释放根的左右子树,然后在释放根(如果先释放根,则丢失了root->left和root->right的信息,则不能知道左右子树的地址,从而无法正常的释放完全),这刚好符合了后序遍历的特点。因此,可以用后序遍历来释放二叉树。
下面是二叉树的析构函数实现方法(利用了后序遍历)
//删除以node为根的二叉树 void deletetree(node*node){ if(node!=NULL){//先利用根中包含了叶子信息的特点去先删除叶子节点 deletetree(node->left); deletetree(node->right); delete node;//最后删除根节点 count--; } }
以下是我们的测试数据:
BST<int,int> a=BST<int,int>(); cout<<a.size()<<endl; if(a.isempty()) cout<<"the tree is empty"<<endl; a.insert(3,4); a.insert(2,4); a.insert(9,4); a.insert(1,4); a.preorder(); cout<<endl; a.inorder(); cout<<endl; a.postorder();
下面是输出的结果:
0
the tree is empty
3 2 1 9
1 2 3 9
1 2 9 3
阅读全文
0 0
- 二分搜索树的遍历
- 关于C++二分搜索树的中序遍历和先序遍历
- 5-5 二分搜索树的遍历(深度优先遍历)
- 二分搜索树的实现
- 二叉搜索树的遍历
- 二叉搜索树的遍历
- 二叉搜索树的遍历
- 5-10 二分搜索树的局限性
- 二分搜索树的基础结构
- 二分搜索树的删除节点操作
- 无处不在的二分搜索
- 二分搜索的应用
- 二分搜索的总结
- 树以及树的遍历和搜索
- 树以及树的遍历和搜索
- 二叉搜索树的创建和遍历
- Sicily 3702. 二叉搜索树的遍历
- 二叉树的遍历以及搜索
- leetcode 506. Relative Ranks
- flash和内存的区别
- 分布式开发--分布式事物
- linux C/S Demo
- HIVE Statistics(三)
- 二分搜索树的遍历
- Matplotlib简单使用
- 项目与领域选型通史
- MySQL的数据备份和还原
- Android WiFi开发
- Spring 自定义环境配置
- centos卸载rpm包的方法
- python实现80s爬虫+xunsearch使用
- 华为研发工程师编程题2明明的随机数