1.把二元查找树转变成排序的双向链表

4 篇文章 0 订阅
2 篇文章 0 订阅

1.把二元查找树转变成排序的双向链表
 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    
  10
  / \
 6 14
 / \ / \
4 8 12 16
    
 转换成双向链表
4=6=8=10=12=14=16。
    
 首先我们定义的二元查找树 节点的数据结构如下:
 struct BSTreeNode
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node

};


解法1 : 拿到一个树的头head,将左边的变成双向list 然后接到head ,将右边的变成双向list然后接到head的右边。递归此过程.

复杂度 :每一个node都要调一遍函数,所以复杂度为 n

#include "BSTreeNode.h"
#include <cstddef>


inline BSTreeNode* getListLeft(BSTreeNode* node){
	if(node == NULL) return NULL;
	while(node->m_pLeft != NULL){
		node = node->m_pLeft;
	}
	return node;
}

inline BSTreeNode* getListRight(BSTreeNode* node){
	if(node == NULL) return NULL;
	while(node->m_pRight != NULL){
		node = node->m_pRight;
	}
	return node;
}

BSTreeNode* tree2List_1(BSTreeNode *head){
	if(head->m_pLeft != NULL &&head->m_pLeft->m_pRight != head){
		BSTreeNode* node = tree2List_1(head->m_pLeft);
		BSTreeNode* right = getListRight(node);
		right->m_pRight = head;
		head->m_pLeft = right;
	}
	if(head->m_pRight != NULL && head->m_pRight->m_pLeft != head){
		BSTreeNode* node = tree2List_1(head->m_pRight);
		BSTreeNode* left = getListLeft(node);
		left->m_pLeft = head;
		head->m_pRight = left;
	}
	return head;
}

BSTreeNode* tree2List(BSTreeNode *head){
	return getListLeft(tree2List_1(head));
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值