笨方法求Convert Sorted List to Binary Search Tree

本题中规中矩的求平衡的BST,因为是在递增有序的单链表上求平衡BST,所以只要考虑RR情况。

代码流程是:

1.每次在最右边插入新节点---rightestnode();

2.检查是否平衡,若平衡则回到1;若否,找到第一个不平衡的节点---notbalancenode(),到3;

3.若不平衡,则发现不平衡节点的父节点---findp(),到4;

4.RR旋转,注意根节点root的修改---rr().

/**
 * Definition for singly-linked list.*/
   struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
  };
/**
 * Definition for binary tree*/
  struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  };


class Solution {
public:
    TreeNode *sortedListToBST(ListNode *head) {
if(head==NULL)
return NULL;
int i,j,k;
bool flag=false;
TreeNode *root,*parent,*cur,*tmp;
ListNode *go=head;
while(go!=NULL)
{
i=go->val;
go=go->next;
cur=(TreeNode *)malloc(sizeof(TreeNode));
cur->val=i;
cur->left=cur->right=NULL;
if(go==head->next)
{
root=cur;
}
else
{
tmp=rightestnode(root);
tmp->right=cur;
}
notbalancenode(root,flag,cur);
if(flag)
{
parent=findp(root,cur);
rr(parent,cur,root);
flag=false;
}


}
return root;
    }
TreeNode *findp(TreeNode *r,TreeNode *target)
{
TreeNode *p;
p=r;
if(r==target)
return NULL;
while(p->right!=NULL && p->right!=target)
p=p->right;
return p;
}
int leveltree(TreeNode *r)
{
if(r==NULL)
return 0;
return ((leveltree(r->left)>leveltree(r->right))?leveltree(r->left):leveltree(r->right))+1;
}

void notbalancenode(TreeNode *r,bool &flag,TreeNode * &notb)
{
if(r==NULL)
{
flag=false;
notb=NULL;
}
TreeNode *tmp=r;
int i,j,k;
while(tmp!=NULL)
{
i=leveltree(tmp->left);
j=leveltree(tmp->right);
if(abs(i-j)>=2)
{
flag=true;
notb=tmp;
}
tmp=tmp->right;
}
}
TreeNode *rightestnode(TreeNode *r)
{
if(r==NULL)
return NULL;
TreeNode *tmp=r;
while(tmp->right!=NULL)
tmp=tmp->right;
return tmp;
}
void rr(TreeNode * &p,TreeNode * &cur,TreeNode * &r)
{
TreeNode *tmp=cur->right;
cur->right=tmp->left;
tmp->left=cur;
if(p!=NULL)
{
if(p->val>cur->val)
p->left=tmp;
else
p->right=tmp;
}
else
{
r=tmp;
}

}
};

层次遍历查看构造的平衡BST树:

void levelorder(TreeNode *root)
{
queue<TreeNode * >q;
TreeNode *tmp;
q.push(root);
while(!q.empty())
{
tmp=q.front();
q.pop();
printf("%d ",tmp->val);
if(tmp->left!=NULL)
q.push(tmp->left);
if(tmp->right!=NULL)
q.push(tmp->right);
}
}

猜你喜欢

转载自blog.csdn.net/ZHUJIANWEILI4/article/details/44925457