数据结构:根据有序链表构造平衡二叉树

#include <iostream>
#include <stack>
using namespace std;

struct Node
{
	int data;
	Node* next;
	Node(int d = int()):data(d){}
};
class List
{
	friend class T;
	public:
	List():first(NULL){}
	void Insert(int a[],int n)
	{
		Node *p = NULL;
		for(int i=0;i<n;i++)
		{
				Node *s = new Node(a[i]);
				if(first==NULL)
				{
					first=s;
					p=s;
				}
				else
				{
					s->next = p->next;
					p->next = s;
					p = s;
				}
		}
	}
	void Printf()
	{
		Node* p = first;
		while(p!=NULL)
		{
			cout<<p->data<<" ";
			p=p->next;
		}
		cout<<endl;
	}
	private:
	Node *first;
};
/////////////////////////////////
struct tNode
{
	int val;
	int bf;//平衡因子。
	tNode *left;
	tNode *right;
	tNode(int d = int()):val(d),left(NULL),right(NULL),bf(0){}
};

class T
{
	public:
	T():root(NULL){}
	void Create(List &list)
	{
		Node *p = list.first;
		tNode *q = NULL;
		while(p!=NULL)
		{
			tNode *s = new tNode(p->data);
			if(root==NULL)
			{
				root = s;
				q = s;
			}
			else
			{
			   tNode* pr = 	NULL;
 				 stack<tNode*> st;
				 while(q->right!=NULL)
					{
						pr=q;
						st.push(pr);
						q=q->right;
					}
					s->right = q->right;
					q->right = s;

					int count = 0;
					while(st.empty()==false)
					{
					  tNode *tnode = st.top();
						st.pop();
						if(tnode->val>q->val)
							tnode->bf--;
						else
							tnode->bf++;
						if(tnode->bf==0)
							{
							break;
							}
						else if(tnode->bf==1)
							{
							continue;
							}
						else
							{
							 tNode* temp = NULL;
							int flags = 0;
							 if(st.empty()==true)
									root=q;//判断是否是根节点旋转。
							 else
								{
							    temp = st.top();
									st.pop();
									if(temp->right==tnode)
										flags=1;
									else
										flags=-1;
								}
							  LR(tnode,q);//旋转。
								if(flags==1)
								{
									temp->right=q;
								}
								else
								{
									temp->left=q;
								}
							 break;
							}
						q=tnode;
					}
				}
			p=p->next;
		}
	}
	void LR(tNode* &t,tNode* &p)
	{
			t->right = p->left;
			p->left = t;
			p->bf=0;
			t->bf=0;
	}
	void Printf()
	{
		Printf(root);
	}
	private:
	void Printf(tNode *t)
	{
		if(t==NULL)return;
		else
		{
			Printf(t->left);
			cout<<t->val<<" ";
			Printf(t->right);
		}
	}
	private:
	tNode *root;
};

int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9};
	List list;
	list.Insert(a,sizeof(a)/sizeof(int));
	T t;
	t.Create(list);
	t.Printf();//二叉树中序打印。
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-22 04:42:10

数据结构:根据有序链表构造平衡二叉树的相关文章

数据结构学习---有序链表的合并

递归调用 简单 有点像归并排序的合并部分吧. 因为是用vs创建的工程,所以主函数是_tmain. 1 // 链表.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 6 7 typedef struct Node { 8 int data; 9 struct Node *next; 10 11 } LinkList; 12 13 14 //链表组合的函数 输入:两个有序无头结点链表 输出:将链表组合成一个无头结点有序链表 15 Lin

算法之 有序链表和平衡二叉树

题目描述: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个有序的链表,要求构建一颗平衡二叉查找树. 解析:二叉查找树的中序遍历的结构就是一颗二叉查找树,要使得最终的二叉查找树的结构尽可能的平衡,也就是说只需要将左右两边的节点数尽可能的均匀,(注意,此处的均匀是一个递归的概念,也就是说每一个节点的左右子树的节点个数都应

根据有序链表构造平衡的二叉查找树

leetcode地址: https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/ 难度:中等 描述: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanc

[LeetCode] 109. 有序链表转换二叉搜索树 ☆☆☆(递归)

描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 解析 有序链表,平衡二叉树,很自然想到将链表一分为二,两部分就是中间节点的左右节点.递归执行左右2个部分的节点

数据结构之 线性表---有序链表的建立

mxjj130304杨少鹏(13110581086)        注销 数据结构实验之链表六:有序链表的建立 数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS    Memory limit: 65536K 题目描述 输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表. 输入 第一行输入整数个数N: 第二行输入N个无序的整数. 输出 依次输出有序链表的结点值. 示例输入 6 33 6 22 9 44 5 示例输出 5 6 9 22 3

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5

数据结构之 线性表---有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5

数据结构实验之链表六:有序链表的建立

Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表. 输入 第一行输入整数个数N: 第二行输入N个无序的整数. 输出 依次输出有序链表的结点值. 示例输入 6 33 6 22 9 44 5 示例输出 5 6 9 22 33 44 提示 不得使用数组! 来源 示例程序 #include <stdio.h> #include <string.h> #include

python数据结构与算法——链表

具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向链表的实现: http://www.cnblogs.com/yupeng/p/3413800.html 我这里只实现了单链表的类型,代码也相对精简一点: 先构造关于节点的类: 1 class Node: 2 def __init__(self,data=None,next=None): 3 self