【劍指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】如何建立一顆二叉樹

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