首页 > 编程语言 > 详细

【剑指offer】二叉搜索树转双向链表,C++实现

时间:2018-04-10 16:26:48      阅读:167      评论:0      收藏:0      [点我收藏+]

原创博文,转载请注明出处!

# 题目

      输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。要求不能创建任何新的节点,只能调整树中节点指针的指向。

  • 二叉树节点的定义
  1 /*
  2 struct TreeNode {
  3 	int val;
  4 	struct TreeNode *left;
  5 	struct TreeNode *right;
  6 	TreeNode(int x) :
  7 			val(x), left(NULL), right(NULL) {
  8 	}
  9 };*/
  • 二叉搜索树转双向链表的例子

技术分享图片

# 思路

  • 二叉搜索树的性质
    • 二叉搜索树是左子树<根节点<右子树
    • 二叉搜索树的中序遍历是递增的有序序列
  • 二叉搜索树转双向链表的思路
    • 二叉搜索树的根节点的左指针指向左子树的最大节点,根节点的右子树指向右子树的最小节点。

技术分享图片


# 代码

  1 /*
  2 struct TreeNode {
  3     int val;
  4     struct TreeNode *left;
  5     struct TreeNode *right;
  6     TreeNode(int x) :
  7             val(x), left(NULL), right(NULL) {
  8     }
  9 };*/
 10 class Solution {
 11 public:
 12     TreeNode* Convert(TreeNode* pRootOfTree)
 13     {/*
 14 struct TreeNode {
 15 	int val;
 16 	struct TreeNode *left;
 17 	struct TreeNode *right;
 18 	TreeNode(int x) :
 19 			val(x), left(NULL), right(NULL) {
 20 	}
 21 };*/
 22 class Solution {
 23 public:
 24     TreeNode* Convert(TreeNode* pRootOfTree)
 25     {
 26         // 双向链表尾节点
 27         TreeNode* list_last = nullptr;
 28 
 29         // 递归转换
 30         ConvertNode(pRootOfTree,list_last);
 31 
 32         // 双向链表首节点
 33         while(list_last->left != nullptr) // 边界条件
 34         {
 35             list_last = list_last->left;
 36         }
 37 
 38         // 返回双向链表的首节点
 39         return list_last;
 40     }
 41 
 42     void ConvertNode(TreeNode* cur,TreeNode* list_last)
 43     {
 44         // 边界条件
 45         if(cur==nullptr) return ;
 46 
 47         // 遍历左子树
 48         if(cur->left != nullptr) ConvertNode(cur->left,list_last);
 49 
 50         // 实现双向链接(建立连接)
 51         cur->left = list_last;
 52         if(list_last != nullptr) list_last->right = cur;
 53         list_last = cur;
 54 
 55         //遍历右子树
 56         if(cur->right != nullptr) ConvertNode(cur->right,list_last);
 57     }
 58 };
 59         if (pRootOfTree == NULL)return NULL;
 60 
 61         TreeNode *pointer = NULL;
 62 
 63         convert2List(pRootOfTree, pointer);
 64 
 65         while (pointer->left!=NULL)
 66         {
 67             pointer = pointer->left;
 68         }
 69         return pointer;
 70     }
 71     void convert2List(TreeNode* pRoot,TreeNode *&pointer)
 72     {
 73         if (pRoot == NULL)
 74         {
 75             return;
 76         }
 77         {
 78             if (pRoot->left != NULL)
 79             {
 80                 convert2List(pRoot->left,pointer);
 81             }
 82 
 83             pRoot->left = pointer;
 84             if (pointer != NULL)
 85             {
 86                 pointer->right = pRoot;
 87             }
 88 
 89             pointer = pRoot;
 90             if (pRoot->right!=NULL)
 91             {
 92                 convert2List(pRoot->right, pointer);
 93             }
 94         }
 95     }
 96 };

【剑指offer】二叉搜索树转双向链表,C++实现

原文:https://www.cnblogs.com/wanglei5205/p/8780086.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!