一.以二叉链表作存储结构,编写一个算法将二叉树左、右子树进行交换的算法。
思路:
创建表示二叉树节点的结构体:
struct TreeNode{
char element;
TreeNode *left;
TreeNode *right;
};
通过输入创建二叉树:
void creatTree(TreeNode *&root){
char c;
cin>>c;
if(c=='#'){ //'#'表示输入空节点
root=NULL;
}
else{
root=new TreeNode;
root->element=c;
creatTree(root->left);
creatTree(root->right);
}
}
#include<iostream>
using namespace std;
struct TreeNode{
char element;
TreeNode *left;
TreeNode *right;
};
void creatTree(TreeNode *&root){
char c;
cin>>c;
if(c=='#'){
root=NULL;
}
else{
root=new TreeNode;
root->element=c;
creatTree(root->left);
creatTree(root->right);
}
}
void change(TreeNode *root){
if(root==NULL){
return ;
}
swap(root->left,root->right);
change(root->left);
change(root->right);
}
void InOrder(TreeNode *root){
if(root==NULL){
return ;
}
InOrder(root->left);
cout<<root->element<<" ";
InOrder(root->right);
}
int main(){
TreeNode *root=new TreeNode;
creatTree(root);
cout<<"交换前的中序遍历"<<endl;
InOrder(root);
cout<<endl;
change(root);
cout<<"交换后的中序遍历"<<endl;
InOrder(root);
cout<<endl;
}
运行结果截图
二.一棵具有n个结点的完全二叉树存放在二叉树的顺序存储结构中,试编写非递归算法对该树进行中序遍历。
#include<iostream>
#include<stack>
using namespace std;
class BinTree{
public:
BinTree(){
maxsize=16;
data=new int[maxsize];
//二叉树储存的有效数据为正整数,-1表示该节点为空
for(int i=0;i<maxsize;i++){
*(data+i)=-1;
}
size=0;
}
BinTree(int _maxsize){
maxsize=_maxsize;
data=new int[maxsize];
for(int i=0;i<maxsize;i++){
*(data+i)=-1;
}
*data=-1;
size=0;
}
void creat(){
cout<<"请输入二叉树序列:"<<endl;
for(int i=1;i<maxsize;i++){
int a;
cin>>a;
if(a==-1){
return ;
}
*(data+i)=a;
}
}
void InOrder(){
stack<int> sta;
int i=1;
while(data[i]!=-1||!sta.empty())
{
while(data[i]!=-1){
sta.push(i);
i=2*i;
//root=data[i];
}
i=sta.top();
cout<<data[i]<<" ";
sta.pop();
i=2*i+1;
// root=data[i];
}
}
private:
int *data;
int maxsize;
int size;
};
int main(){
BinTree *tree=new BinTree();
tree->creat();
tree->InOrder();
return 0;
}
三.试编写算法判别两棵二叉树是否等价。如果T1和T2都是空二叉树,或T1和T2的根结点的值相同,并且T1的左子树与T2的左子树是等价的;T1的右子树与T2的右子树是等价的。
#include<iostream>
using namespace std;
struct TreeNode{
char element;
TreeNode *left;
TreeNode *right;
};
void creatTree(TreeNode *&root){
char c;
cin>>c;
if(c=='#'){
root=NULL;
}
else{
root=new TreeNode;
root->element=c;
creatTree(root->left);
creatTree(root->right);
}
}
void change(TreeNode *root){
if(root==NULL){
return ;
}
swap(root->left,root->right);
change(root->left);
change(root->right);
}
void InOrder(TreeNode *root){
if(root==NULL){
return ;
}
InOrder(root->left);
cout<<root->element<<" ";
InOrder(root->right);
}
bool isEqual(TreeNode *root1,TreeNode *root2){
if(root1==NULL&&root2==NULL)
{
return true;
}
return root1->element==root2->element&&
isEqual(root1->left,root2->left)&&
isEqual(root1->right,root2->right);
}
int main(){
TreeNode *root1=new TreeNode;
creatTree(root1);
cout<<"root1:中序遍历"<<endl;
InOrder(root1);
cout<<endl;
TreeNode *root2=new TreeNode;
creatTree(root2);
cout<<"root2:中序遍历"<<endl;
InOrder(root2);
cout<<endl;
TreeNode *root3=new TreeNode;
creatTree(root3);
cout<<"root3:中序遍历"<<endl;
InOrder(root3);
cout<<endl;
cout<<"root1与root2相等?"<<" "<<isEqual(root1,root2)<<endl;
cout<<"root1与root3相等?"<<" "<<isEqual(root1,root3)<<endl;
return 0;
}