【剑指offer】二叉树的镜像C++实现

有的时候自己想了很久却还是想不出来思路,一看解析却很简单,看来还是应该好好刷题啊!!!

(一)题目描述

在这里插入图片描述

(二)代码
#include <iostream>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};
//镜像实现 
 void Mirror(TreeNode *pRoot) {
		if(pRoot==NULL) return;//若为空则返回 
		queue<TreeNode*> q; //定义一个队列 
		TreeNode* p=NULL; 
		q.push(pRoot);//将根结点加入队列 
		while(q.size()){//队列不为空时 
			p=q.front();//获得队首元素 
			q.pop();//出队 
			swap(p->left,p->right);//交换左右孩子结点,注意 此时左右结点的值已经变了, 
			if(p->left) q.push(p->left);//入队的时候先入的是原来右孩子结点
			if(p->right) q.push(p->right);
		}
    }
typedef struct { //树根
    TreeNode *root;
} Tree;

void insert(Tree* tree, int value)//创建树
{
    TreeNode *node=new TreeNode(value);//新建一个结点 
    node->left = NULL;//将这个结点左右子树置为NULL 
    node->right = NULL;
    if (tree->root == NULL)//判断树是不是空树
    {
    	//若该树为空树,则将该结点置为根结点 
        tree->root = node;
    }
    else {//不是空树
        TreeNode *temp = tree->root;//从树根开始
        while (temp != NULL)//当为null时结束 
        {
 
 
            if (value < temp->val)//小于就进左儿子
            {
                if (temp->left == NULL)
                {
                    temp->left = node;
                    return;
                }
                else {//继续判断
                    temp = temp->left;
                }
            }
            else {//否则进右儿子
 
                if (temp->right == NULL)
                {
                    temp->right = node;
                    return;
                }
                else {//继续判断
                    temp = temp->right;
                }
            }
        }
    }
    return;
}
 
void inorder(TreeNode* node)//树的中序遍历
{
    if (node != NULL)
    {
    	 
        inorder(node->left);
         printf("%d ",node->val);
        inorder(node->right);
    }
}
 void preorder(TreeNode* node)//树的中序遍历
{
    if (node != NULL)
    {
    	 printf("%d ",node->val);
        preorder(node->left);
        preorder(node->right);
    }
}
int main()
{
    Tree tree;
    tree.root = NULL;//创建一个空树
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)//输入n个数并创建这个树
    {
        int temp;
        scanf("%d",&temp);
        insert(&tree, temp);
    }
	preorder(tree.root);//中序遍历
	cout<<endl;
	Mirror(tree.root);
	cout<<"after:"<<endl;
	preorder(tree.root);//中序遍历
	getchar();
    return 0;
}

(三)参考文献

【1】如何建立一颗二叉树

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章