基礎有待增強啊,由該題引起出來一些問題,如今來總結下。ios
首先是二叉樹的結構:函數
struct TreeNode { EleType val; TreeNode *left; TreeNode *right; };
而後是二叉樹,先序遍歷的構建方法,因爲只有擴展後的二叉樹能夠作到一個遍歷序列肯定一顆二叉樹,好比圖所示前序遍歷序列(根左右)就爲12#4##3##。spa
二叉樹構建的代碼,由於要對傳遞的值進行改變,因此不能值傳遞,因此注意這裏的參數爲指向TreeNode類型的指針的一個引用,3d
這是由於若是直接傳遞指針變量,給該函數的形參初始化以後,該形參在退出該函數就自動回收啦。指針
int CreateBiTree(TreeNode* &T) { char data; //按先序次序輸入二叉樹中結點的值(一個字符),‘#’表示空樹 scanf("%c",&data); if(data == '#'){ T = NULL; } else{ T = (TreeNode*)malloc(sizeof(TreeNode)); T->val = data; CreateBiTree(T->left); CreateBiTree(T->right); } return 0; }
該題的思路:主要有遞歸和棧來實現兩種方法。中心對稱即左子樹中某個節點的左孩子=對應的右子樹的節點的右孩子,該節點的右孩子=對應結點的左孩子。code
代碼:blog
#include <iostream> #include <vector> #include <cmath> using namespace std; typedef int EleType; struct TreeNode { EleType val; TreeNode *left; TreeNode *right; }; class Solution { public: bool check(TreeNode *leftNode, TreeNode *rightNode) { if (leftNode == NULL && rightNode == NULL) return true; if (leftNode == NULL || rightNode == NULL) return false; return leftNode->val == rightNode->val && check(leftNode->left, rightNode->right) && check(leftNode->right, rightNode->left); } bool isSymmetric(TreeNode *root) { if (root == NULL) return true; return check(root->left, root->right); } }; //按先序序列建立二叉樹 int CreateBiTree(TreeNode* &T){ int data; //按先序次序輸入二叉樹中結點的值(一個字符),‘#’表示空樹 cin>>data; if(data == -1){ T = NULL; } else{ T = (TreeNode*)malloc(sizeof(TreeNode)); //生成根結點 T->val = data; //構造左子樹 CreateBiTree(T->left); //構造右子樹 CreateBiTree(T->right); } return 0; } int main() { freopen("C:\\Users\\Administrator\\Desktop\\test.txt","r",stdin); TreeNode* root=NULL; CreateBiTree(root); Solution so; cout<<so.isSymmetric(root)<<endl; return 0; }
ps:遞歸的終止條件:左節點和右節點都爲空,則true;遞歸
左節點和右節點中只有一個不爲空,返回false(由於上面的判斷保證了確定有一個不爲空)ci