劍指offer(五十八):對稱的二叉樹
阿新 • • 發佈:2020-08-11
題目描述
請實現一個函式,用來判斷一棵二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。 剛開始的思路:由於題目中說如果與其映象二叉樹相同,那麼就是對稱的,那我就先建立該二叉樹的映象二叉樹,然後比較這兩顆二叉樹是否一樣。 建立映象二叉樹,需要先建立根結點,因為根結點肯定都是一致的,然後遞迴建立當前結點的左右孩子結點,在建立時將其左右孩子交換, 比較映象二叉樹與當前二叉樹:剛開始主要是在遞迴結束條件處沒有思路,應該是兩個節點都為空返回true,有一個結點不為空就要返回false,如果兩個節點都不為空,那麼比較兩者的值,如果不相等返回false,如果相等接著向下比較。/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: bool isSymmetrical(TreeNode* pRoot) { if(!pRoot) return true; TreeNode* mirrorRoot = newTreeNode(pRoot->val); mirrorTree(pRoot,mirrorRoot); bool flag=true; isSymmetrical2(pRoot,mirrorRoot,flag); return flag; } void mirrorTree(TreeNode* pRoot,TreeNode* mirrorRoot){ if(pRoot){ TreeNode* mirrorLeft = NULL; TreeNode* mirrorRight = NULL; if(pRoot->right){ mirrorLeft = new TreeNode(pRoot->right->val); } if(pRoot->left){ mirrorRight = new TreeNode(pRoot->left->val); } mirrorRoot->left = mirrorLeft; mirrorRoot->right = mirrorRight; mirrorTree(pRoot->left,mirrorRoot->right); mirrorTree(pRoot->right,mirrorRoot->left); } } void isSymmetrical2(TreeNode* pRoot,TreeNode* mirrorRoot,bool &flag){ if(pRoot&&!mirrorRoot || !pRoot&&mirrorRoot) flag = false; if(flag&&pRoot&&mirrorRoot){ if(pRoot->val!=mirrorRoot->val) flag = false; else flag = true; isSymmetrical2(pRoot->left,mirrorRoot->left,flag); isSymmetrical2(pRoot->right,mirrorRoot->right,flag); } } };
後來,我發現根本不需要建立映象二叉樹就可以得出結果,只需要returnisSymmetrical(pRoot->left,mirrorRoot->right)&&isSymmetrical(pRoot->right,mirrorRoot->left)左子樹節點和右子樹節點進行比較,右子樹節點和左子樹節點進行比較,這樣的話,減少了空間的使用但是增加了時間的消耗。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: bool isSymmetrical(TreeNode* pRoot) { if(!pRoot) return true; return isSymmetrical(pRoot,pRoot); } bool isSymmetrical(TreeNode* pRoot,TreeNode* mirrorRoot){ if(!pRoot && mirrorRoot || pRoot&&!mirrorRoot) return false; if(!pRoot&&!mirrorRoot) return true; if(pRoot->val!=mirrorRoot->val) return false; return isSymmetrical(pRoot->left,mirrorRoot->right)&&isSymmetrical(pRoot->right,mirrorRoot->left); } };