二叉查找树的非递归操作

二叉查找树的非递归操作

大家好,又见面了,我是全栈君。

昨天同学去參加阿里巴巴面试,被问到二叉树的一些基本问题,分享一下:

1.怎样非递归dfs求得树的深度

2.怎样非递归bfs求得树的深度

*3.怎样非递归地中前后序遍历二叉查找树。

二叉树写过不下十次了。可是基本每次都是用递归来写。一时间问道还不能一下写出来。

问题二还是比較好写,一的话可能须要细致想想,可是假如是面试的话。可能我一时也说不出来。

老实说,我自己写得代码总得看来是满长的。可是局部核心的是相对照较好理解的。

/*********************************************************** > OS : Linux 3.13.0-24-generic (Mint-17) > Author : yaolong > Mail : dengyaolong@yeah.net > Time : 2014年09月18日 星期四 12时24分57秒 **********************************************************/ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stack> #include <queue> #include <cstdlib> using namespace std; template<typename Comparable> class BinarySearchTree { public: BinarySearchTree() { root = NULL; }; void insert ( Comparable x ) //非递归插入 { if ( root == NULL ) //由于不是传引用指针 { root = new Node ( x ); } else { insert ( x, root ); } } bool contains ( Comparable x ) //递归查询 { return contains ( x, root ); } void travel_in() //非递归中序遍历 { travel_in ( root ); } void travel_dg_in() //递归中序遍历 { travel_dg_in ( root ); } void travel_pre() //非递归前序遍历 { travel_pre ( root ); } void travel_dg_pre() //递归前序遍历 { travel_dg_pre ( root ); } void travel_suf() //非递归后序遍历,略微难 { travel_suf ( root ); } void travel_dg_suf() //递归后序遍历 { travel_dg_suf ( root ); } int get_depth_dg() //递归搜索树的深度 { return get_depth_dg ( root ); } int get_depth_dfs() //非递归,深度搜索树的深度 { return get_depth_dfs ( root ); } int get_depth_bfs() //非递归。宽度搜索树得深度 { return get_depth_bfs ( root ); } private: class Node { public: Comparable element; Node *left; Node *right; Node ( Comparable e , Node *l = NULL, Node *r = NULL ) : element ( e ), left ( l ), right ( r ) { } }; void insert ( Comparable x, Node *p ) { while ( 1 ) { if ( x > p->element ) //比当前节点元素大。插入到右边 { if ( p->right == NULL ) { p->right = new Node ( x ); return; } p = p->right; } else if ( x < p->element ) { if ( p->left == NULL ) { p->left = new Node ( x ); return; } p = p->left; } else { //nothing to do return; } } } bool contains ( Comparable x, Node *p ) { while ( p != NULL ) { if ( x > p->element ) { p = p->right; } else if ( x < p->element ) { p = p->left; } else { return 1; } } return 0; } void travel_pre ( Node *p ) //前序遍历 { stack<Node *> stk; while ( p != NULL || !stk.empty() ) { while ( p != NULL ) //先读。再往左。知道叶子 { cout << p->element << " "; stk.push ( p ); p = p->left; } if ( !stk.empty() ) //左路訪问完,退回訪问右路,即用右儿子进行继续递归,进行前序遍历 { p = stk.top(); stk.pop(); p = p->right; } } } void travel_dg_pre ( Node *p ) { if ( p == NULL ) { return; } cout << p->element << " "; travel_dg_pre ( p->left ); travel_dg_pre ( p->right ); } void travel_in ( Node *p ) { stack<Node *> stk; while ( p != NULL || !stk.empty() ) { while ( p != NULL ) { stk.push ( p ); p = p->left; } if ( !stk.empty() ) { p = stk.top(); stk.pop(); cout << p->element << " "; p = p->right; } } } void travel_dg_in ( Node *p ) { if ( p == NULL ) { return; } travel_dg_in ( p->left ); cout << p->element << " "; travel_dg_in ( p->right ); } void travel_suf ( Node *p ) { stack<Node *> stk; Node *prev = NULL; while ( p != NULL || !stk.empty() ) { while ( p != NULL ) { stk.push ( p ); p = p->left; } p = stk.top(); if ( p->right == NULL || p->right == prev ) { cout << p->element << " "; prev = p; stk.pop(); p = NULL; } else { p = p->right; } } } void travel_dg_suf ( Node *p ) { if ( p == NULL ) { return; } travel_dg_suf ( p->left ); travel_dg_suf ( p->right ); cout << p->element << " "; } int get_depth_dfs ( Node *p ) { int depth = 0, d = 0; stack<Node *> stk; stack<int> stk_depth; while ( p != NULL || !stk.empty() ) { while ( p != NULL ) { stk.push ( p ); stk_depth.push ( d++ ); p = p->left; } if ( !stk.empty() ) { d = stk_depth.top(); depth = max ( d, depth ); p = stk.top(); stk.pop(); stk_depth.pop(); p = p->right; d++; } } return depth; } int get_depth_bfs ( Node *p ) { queue<Node *> q; queue<int> q_d; int d = 0; int depth = 0; q.push ( p ); q_d.push ( d ); while ( !q.empty() ) { p = q.front(); d = q_d.front() ; ++d; q.pop(); q_d.pop(); if ( p->left != NULL ) { q_d.push ( d ) ; q.push ( p->left ); depth = max ( depth, d ); } if ( p->right != NULL ) { q_d.push ( d ) ; q.push ( p->right ); depth = max ( depth, d ); } } return depth; } int get_depth_dg ( Node *p ) { int depth = 0; if ( p->left != NULL ) { depth = max ( depth, get_depth_dg ( p->left ) + 1 ); } if ( p->right != NULL ) { depth = max ( depth, get_depth_dg ( p->right ) + 1 ); } return depth; } Node *root; }; int main() { BinarySearchTree<int> t; for ( int i = 0; i < 100; i++ ) { int tmp = random() % 100000; //cout<<tmp; t.insert ( tmp ); } cout << "Insert OK" << endl; cout << t.contains ( 4 ) << endl; cout << t.contains ( 2 ) << endl; cout << "非递归递归前序遍历:\n"; t.travel_pre(); cout << "\n递归前序遍历\n"; t.travel_dg_pre(); cout << "\n递归中序遍历\n"; t.travel_dg_in(); cout << "\n非递归递归中序遍历:\n"; t.travel_in(); cout << "\n递归后序遍历\n"; t.travel_dg_suf(); cout << "\n非递归递归后序遍历:\n"; t.travel_suf(); cout << "\n递归求的树的高度\n"; cout << t.get_depth_dg(); cout << "\n非递归dfs求的树的高度\n"; cout << t.get_depth_dfs(); cout << "\n非递归bfs求的树的高度\n"; cout << t.get_depth_bfs(); } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115773.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Python中常用的第三方库_vscode如何使用第三方库

    Python中常用的第三方库_vscode如何使用第三方库第10章Python第三方库使用1.Python第三方库的获取和安装1.1pip工具安装1.2自定义安装1.3文件安装1.4pip工具使用2.pyinstaller库概述3.pyinstaller库与程序打包4.jieba库概述5.jieba库与中文分词6.wordcloud库概述7.wordcloud库与可视化词云1.Python第三方库的获取和安装Python第三方库依照安装方式灵活性和难易程度有3个方法,这3个方法是:pip工具安装、

    2022年10月14日
  • resnet34 pytorch_pytorch环境搭建

    resnet34 pytorch_pytorch环境搭建导师的课题需要用到图片分类;入门萌新啥也不会,只需要实现这个功能,给出初步效果,不需要花太多时间了解内部逻辑。经过一周的摸索,建好环境、pytorch,终于找到整套的代码和数据集,实现了一个小小的分类。记录一下使用方法,避免后续使用时遗忘。感谢各位大佬的开源代码和注释!找到一个大佬的视频讲解和代码开源:github:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/data_setbilb

  • 图片批量重命名(python实现)「建议收藏」

    图片批量重命名(python实现)「建议收藏」自己在采集数据时,有时候的数据命名方式并不满足一些开源程序的条件,如果我们可以自己随意去改变图像的命名,问题就变得很容易解决;一、代码importospath=”/media/hltt3838/DATA/dida_data/20210421_camera_IMU/dataset-dir/cam0″filelist=os.listdir(path)count=1403636580513555456forfileinfilelist:print(file)for

  • 面向对象程序设计的基本概念_java面向对象程序设计

    面向对象程序设计的基本概念_java面向对象程序设计Java程序设计(面向对象)- 基本概念

  • Android 结合实例学会AsyncTask的使用方法

    Android 结合实例学会AsyncTask的使用方法

    2021年12月13日
  • mshta 反弹shell

    mshta 反弹shell  kali系统准备:  复制以下ruby代码到/usr/share/metasploit-framework/modules/exploits/windows/smb/msh_shell.rb目录(要注意代码缩进哦):###ThismodulerequiresMetasploit:https://metasploit.com/download#Currentso…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号