/==================讲一个二叉树变为排序二叉树===
struct TreeNode
{
int data;
TreeNode *right,*left;
};
void InsertBSTree(TreeNode **root,int data)
{
if(root==NULL)
return;
TreeNode *tempNode=new TreeNode;
tempNode->data=data;
tempNode->left=NULL;
tempNode->right=NULL;
TreeNode *p=*root,*parent=NULL;
while(p)
{
parent=p;
if(p->data>data)
{
p=p->left;
}
else
p=p->right;
}
if(parent==NULL)
*root=tempNode;
else
{
if(parent->data>data)
parent->left=tempNode;
else
parent->right=tempNode;
}
}
void Pretranverse(TreeNode *root,TreeNode **BSTroot)
{
if(root)
{
InsertBSTree(BSTroot,root->data);
Pretranverse(root->left,BSTroot);
Pretranverse(root->right,BSTroot);
}
}
void ConvertTree2BST(TreeNode *root,TreeNode **BSTroot)
{
Pretranverse(root,BSTroot);
{
if(root==NULL || layer<=0)
return;
if(layer==1)
cout<<root->data<<" ";
else
{
ShowLayerTree(root->left,layer-1);
ShowLayerTree(root->right,layer-1);
}
}
//中序遍历+前序遍历重构二叉树
void CreateTree1(TreeNode **root,int Mid[],int Pre[],int length)
{
if(root==NULL) return;
if(length<=0) return;
*root=new TreeNode;
(*root)->data=Pre[0];
(*root)->left=NULL;
(*root)->right=NULL;
int i=0;
while(Mid[i]!=Pre[0])
i++;
CreateTree1(&(*root)->left,Mid,Pre+1,i);
CreateTree1(&(*root)->right,Mid+i+1,Pre+i+1,length-i-1);
}
//非递归中序遍历二叉树
void MidTranverse(TreeNode *root)
{
if(root==NULL)
return;
stack<TreeNode *>mystack;
TreeNode *p=root;
while(p||!mystack.empty())
{
if(p)
{
mystack.push(p);
p=p->left;
}
else if(!mystack.empty())
{
p=mystack.top();
cout<<p->data<<" ";
p=p->right;
mystack.pop();
}
}
}
TreeNode * Findparent(TreeNode *root,TreeNode *tar)
{
if(root==NULL ||tar==NULL)
return NULL;
if(root==tar)
return NULL;
if(root->left==tar || root->right==tar)
return root;
TreeNode *result=Findparent(root->left,tar);
if(result)
return result;
else
return Findparent(root->right,tar);
}
bool IsIncludedinTree(TreeNode *root,TreeNode *tar)
{
if(root==NULL || tar==NULL)
return false;
if(root==tar)
return true;
else
return IsIncludedinTree(root->left,tar)||IsIncludedinTree(root->right,tar);
}
//删除BST上的节点
void DeleteNodeofBST(TreeNode **root,TreeNode *tar)
{
if(root==NULL || *root==NULL ||tar==NULL)
return;
if(!IsIncludedinTree(*root,tar))
return;
if(tar->left==NULL || tar->right==NULL)
{
if(tar->left==NULL && tar->right==NULL)
{
delete tar;
return;
}
TreeNode *temp=tar->left;
if(tar->right)
temp=tar->right;
tar->data=temp->data;
tar->left=temp->left;
tar->right=temp->right;
delete temp;
return;
}
//找tar的中序遍历的前驱(左子树的最右节点)
TreeNode *parent=tar;
TreeNode *leftest=tar->left;
while(leftest->right)
{
parent=leftest;
leftest=leftest->right;
}
tar->data=leftest->data;
if(parent!=tar)
{
parent->right=leftest->left;
}
else
tar->left=leftest->left;
delete leftest;
}
struct TreeNode
{
int data;
TreeNode *right,*left;
};
void InsertBSTree(TreeNode **root,int data)
{
if(root==NULL)
return;
TreeNode *tempNode=new TreeNode;
tempNode->data=data;
tempNode->left=NULL;
tempNode->right=NULL;
TreeNode *p=*root,*parent=NULL;
while(p)
{
parent=p;
if(p->data>data)
{
p=p->left;
}
else
p=p->right;
}
if(parent==NULL)
*root=tempNode;
else
{
if(parent->data>data)
parent->left=tempNode;
else
parent->right=tempNode;
}
}
void Pretranverse(TreeNode *root,TreeNode **BSTroot)
{
if(root)
{
InsertBSTree(BSTroot,root->data);
Pretranverse(root->left,BSTroot);
Pretranverse(root->right,BSTroot);
}
}
void ConvertTree2BST(TreeNode *root,TreeNode **BSTroot)
{
Pretranverse(root,BSTroot);
}
//遍历二叉树的某一层
void ShowLayerTree(TreeNode *root,int layer){
if(root==NULL || layer<=0)
return;
if(layer==1)
cout<<root->data<<" ";
else
{
ShowLayerTree(root->left,layer-1);
ShowLayerTree(root->right,layer-1);
}
}
//中序遍历+前序遍历重构二叉树
void CreateTree1(TreeNode **root,int Mid[],int Pre[],int length)
{
if(root==NULL) return;
if(length<=0) return;
*root=new TreeNode;
(*root)->data=Pre[0];
(*root)->left=NULL;
(*root)->right=NULL;
int i=0;
while(Mid[i]!=Pre[0])
i++;
CreateTree1(&(*root)->left,Mid,Pre+1,i);
CreateTree1(&(*root)->right,Mid+i+1,Pre+i+1,length-i-1);
}
//非递归中序遍历二叉树
void MidTranverse(TreeNode *root)
{
if(root==NULL)
return;
stack<TreeNode *>mystack;
TreeNode *p=root;
while(p||!mystack.empty())
{
if(p)
{
mystack.push(p);
p=p->left;
}
else if(!mystack.empty())
{
p=mystack.top();
cout<<p->data<<" ";
p=p->right;
mystack.pop();
}
}
}
//找二叉树的父节点
TreeNode * Findparent(TreeNode *root,TreeNode *tar)
{
if(root==NULL ||tar==NULL)
return NULL;
if(root==tar)
return NULL;
if(root->left==tar || root->right==tar)
return root;
TreeNode *result=Findparent(root->left,tar);
if(result)
return result;
else
return Findparent(root->right,tar);
}
bool IsIncludedinTree(TreeNode *root,TreeNode *tar)
{
if(root==NULL || tar==NULL)
return false;
if(root==tar)
return true;
else
return IsIncludedinTree(root->left,tar)||IsIncludedinTree(root->right,tar);
}
//删除BST上的节点
void DeleteNodeofBST(TreeNode **root,TreeNode *tar)
{
if(root==NULL || *root==NULL ||tar==NULL)
return;
if(!IsIncludedinTree(*root,tar))
return;
if(tar->left==NULL || tar->right==NULL)
{
if(tar->left==NULL && tar->right==NULL)
{
delete tar;
return;
}
TreeNode *temp=tar->left;
if(tar->right)
temp=tar->right;
tar->data=temp->data;
tar->left=temp->left;
tar->right=temp->right;
delete temp;
return;
}
//找tar的中序遍历的前驱(左子树的最右节点)
TreeNode *parent=tar;
TreeNode *leftest=tar->left;
while(leftest->right)
{
parent=leftest;
leftest=leftest->right;
}
tar->data=leftest->data;
if(parent!=tar)
{
parent->right=leftest->left;
}
else
tar->left=leftest->left;
delete leftest;
}