您的位置:首页 > 职场人生

剑指offer——面试题27:二叉搜索树与双向链表

2015-08-19 15:51 447 查看
题目:

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

思路:

这道题的思路是采用递归的思想,我的是采用后序遍历,每次返回的是已经改变好的双向链表,只不过返回的那个节点root在中间

那么它的左子树那边返回我需要向右移动到最后一个结点,(相当于遍历了左子树)

右子树返回的我需要向左移动到最开始那个节点,(相当于遍历了右子树)

然后与这个根节点连接起来(相当于最后遍历根节点)在这里需要的互相连接,开始就是这里出了问题。

下面是代码:

#include<iostream>
using namespace std;

struct Node
{
int val;
Node* left;
Node* right;
Node(int x):val(x),left(NULL),right(NULL){}
};

Node* change(Node* root)
{
if(root==NULL)
return root;

if(root->left==NULL&&root->right==NULL)
return root;

Node* root1=NULL;
Node* root2=NULL;
if(root->left!=NULL)
{
root1=change(root->left);
while(root1->right!=NULL)
root1=root1->right;
}
if(root->right!=NULL)
{
root2=change(root->right);
while(root2->left!=NULL)
root2=root2->left;
}

root->left=root1;
root1->right=root;
root->right=root2;
root2->left=root;
return root;
}

int main()
{
Node* root=new Node(10);
root->left=new Node(6);
root->right=new Node(14);
root->left->left=new Node(4);
root->left->right=new Node(8);
root->right->left=new Node(12);
root->right->right=new Node(16);

Node *root2=change(root);
while(root2->left!=NULL)
root2=root2->left;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: