Symmetric Tree(DFS,二叉樹的構建以及測試代碼)

基礎有待增強啊,由該題引起出來一些問題,如今來總結下。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

相關文章
相關標籤/搜索