二叉搜索树与双向链表
2016-04-02 12:44
267 查看
// 排序二叉树与双向链表.cpp : 定义控制台应用程序的入口点。 // 题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 // 思路:通过对一颗排序二叉树的认识可知一颗排序二叉树中序输出就是有序的 // 通过后序遍历让子树分别找到自己的left和right结点,然后再与根节点相结合, // 结合原则:一个结点的left是左子树的最右孩子,一个结点的right是右子树的最左孩子 // 通过后序遍历就不必保存中间结果。 #include "stdafx.h" struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; TreeNode* dfs(TreeNode* pRootOfTree); TreeNode* findLeft(TreeNode* pRootOfTree); // 声明着大批左节点函数,指向左子树的最右孩子 TreeNode* findRight(TreeNode* pRootOfTree); //声明找到右结点函数,指向右子树的最左孩子 TreeNode* Convert(TreeNode* pRootOfTree) { if (pRootOfTree == NULL) return NULL; TreeNode* tmp = dfs(pRootOfTree); //递归的改变树的left和right区域 while (tmp->left != NULL) { tmp = tmp->left; } TreeNode* res = tmp; /*while (tmp->right != NULL) { tmp->right->left = tmp; tmp = tmp->right; }*/ return res; } TreeNode* dfs(TreeNode* pRootOfTree) { if (pRootOfTree == NULL) return NULL; if (pRootOfTree->left != NULL) dfs(pRootOfTree->left); //处理左子树 if (pRootOfTree->right != NULL) dfs(pRootOfTree->right); //处理右子树 pRootOfTree->left = findLeft(pRootOfTree->left); //处理自身,找到自己的left,并把找到的right结点的left域指向自己 if (findLeft(pRootOfTree->left) != NULL) findLeft(pRootOfTree->left)->right = pRootOfTree; pRootOfTree->right = findRight(pRootOfTree->right); //处理自身,找到自己的right,并把找到的left结点的right域指向自己 if (findRight(pRootOfTree->right) != NULL) findRight(pRootOfTree->right)->left = pRootOfTree; return pRootOfTree; } TreeNode* findLeft(TreeNode* pRootOfTree) { //左子树的最右孩子 TreeNode* tmp = pRootOfTree; if (tmp == NULL) return NULL; while (tmp->right != NULL) { tmp = tmp->right; } return tmp; } TreeNode* findRight(TreeNode* pRootOfTree) { //右子树的最左孩子 TreeNode* tmp = pRootOfTree; if (tmp == NULL) return NULL; while (tmp->left != NULL) { tmp = tmp->left; } return tmp; } int main() //生成测试数据 { TreeNode *head; TreeNode *test4 = new TreeNode(4); TreeNode *test6 = new TreeNode(6); TreeNode *test8 = new TreeNode(8); TreeNode *test10 = new TreeNode(10); TreeNode *test12 = new TreeNode(12); TreeNode *test14 = new TreeNode(14); TreeNode *test16 = new TreeNode(16); test10->left = test6; test10->right = test14; test6->left = test4; test6->right = test8; test14->left = test12; test14->right = test16; TreeNode* res = Convert(test10); return 0; }
相关文章推荐
- Visual Studio Code中配置GO开发环境
- php+html 实现加减乘除
- 【细说Java】Java封箱拆箱的一些问题
- php的exit和die
- mac PHP开发环境搭建
- svn 清理失败 (cleanup 失败) 的解决方法
- 链接数据库验证表单登陆
- 单点登录、统一认证解决方案
- STM32 USB 上位机程序实现
- 【笔记】 《js权威指南》- 第5章 语句
- Objective-c 对象与类 继承
- [Elixir005] 查看指定数据的详细信息 i helper
- 七种排序算法
- 搭建nginx+tomcat+Java的负载均衡环境
- Android关于定时器Timer的定义及用法
- Nginx将通过IP访问重定向
- 根据权重决定展示哪张图片的小算法(python+java)板砖
- 三角形类布尔型
- 【JQuery】使用one()方法绑定元素的一次性事件
- 接口和抽象类浅析