二叉搜索树与双向链表

题目:二叉搜索树与双向链表

题目描述

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

思路

将二叉搜索树拉直,左边为小右边为大,然后连接左边和根、右边和根。注意返回最小的节点才能通过测试用例。

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    TreeNode* C(TreeNode* root){
		if(root==NULL) return NULL;
        TreeNode *l,*r;
        l = C(root->left);
        r = C(root->right);
        if(l){
        	while(l->right) l = l->right;
        	l->right = root;
        	root->left = l;
		} 
		if(r){
			while(r->left) r = r->left;
			r->left = root;
			root->right = r;
		}
		return root;
	}
	TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==NULL) return NULL;
        pRootOfTree = C(pRootOfTree);
        while(pRootOfTree->left) pRootOfTree = pRootOfTree->left;
		return pRootOfTree;
    }
};

 

 

 

第一次测试代码死活不通过,我连测试用例都写了,然后说

用例:
{10,6,14,4,8,12,16}

对应输出应该为:

From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;

你的输出为:

From left to right are:10,12,14,16;From right to left are:16,14,12,10,8,6,4;

原因是返回的是最小的节点。

#include<bits/stdc++.h> 
using namespace std;
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};
	TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==NULL) return NULL;
        TreeNode *l,*r;
        l = Convert(pRootOfTree->left);
        r = Convert(pRootOfTree->right);
        if(l){
        	while(l->right) l = l->right;
        	l->right = pRootOfTree;
        	pRootOfTree->left = l;
		} 
		if(r){
			while(r->left) r = r->left;
			r->left = pRootOfTree;
			pRootOfTree->right = r;
		}
		return pRootOfTree;
    }
TreeNode * Build(vector<int> &v){
	int size = v.size();
	if(size==0) return NULL;
	TreeNode *res = new TreeNode(v[0]);
	queue<TreeNode *> q;
	q.push(res);
	int i=1;
	while(q.size()>0 && i<size){
		int size2 = q.size();
			while(size2 && i<size){
				TreeNode *now = q.front();
				now->left = new TreeNode(v[i++]);
				now->right = new TreeNode(v[i++]);
				q.push(now->left);
				q.push(now->right);
				q.pop();
			}
	}
	return res;
}
vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
		if(root == NULL) return res;
		queue<TreeNode *> q;
		q.push(root);
		while(q.size()>0){
			int size = q.size();
			while(size){
				TreeNode *now = q.front();
				res.push_back(now->val);
				if(now->left)
					q.push(now->left);
				if(now->right)
					q.push(now->right);
				q.pop();
				size--;
			}
		}
		return res;
}
int main(){
	vector<int> v = {10,6,14,4,8,12,16};
	TreeNode *r = Build(v);
	vector<int> vv = PrintFromTopToBottom(r);
	for(int i=0;i<vv.size();i++)
		cout<<vv[i]<<" ";
	cout<<endl;
	r = Convert(r);
	while(r->right) r = r->right;
	while(r){
		cout<<r->val<<" ";
		r = r->left;
	}
	cout<<endl;

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值