Invert Binary Tree
Invert a binary tree.
4 / \ 2 7 / \ / \ 1 3 6 9to
4 / \ 7 2 / \ / \ 9 6 3 1
几周前,我用的是递归解法,如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* invertTree(struct TreeNode* root) {
struct TreeNode * h = root;
struct TreeNode *p = NULL;
if(h!=NULL){
if(h->left && h->right){
p=h->left;
h->left = h->right;
h->right = p;
h->left = invertTree(h->left);
h->right =invertTree(h->right);
}
else if(h->left){
h->right = h->left;
h->left = NULL;
h->right =invertTree(h->right);
}
else if(h->right){
h->left = h->right;
h->right = NULL;
h->left = invertTree(h->left);
}
else if(h->right==NULL && h->left==NULL)
return h;
}
}
当时用的是c语言,
68 / 68 test cases passed.
|
Status:
Accepted |
Runtime: 0 ms
|
然后,今天又在剑指offer上看到这题,想用非递归实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode *> stk;
TreeNode *p,*h;
h=root;
while(h ){
if(h){
if(h->left==NULL && h->right!=NULL){
p = h->right;
h->left = p;
h->right = NULL;
h=h->left;
}
if(h->left!=NULL &&h->right==NULL){
p = h->left;
h->right = p;
h->left = NULL;
h=h->right;
}
if(h->left == NULL && h->right==NULL){
if(!stk.empty()){
h = stk.top();
stk.pop();
h=h->right;
}
else break;
}
if(h->left != NULL && h->right!=NULL){
stk.push(h);
p =h->left;
h->left = h->right;
h->right = p;
h= h->left;
}
}
}
return root;
}
};
用的是c++实现的,耗时多一点
68 / 68 test cases passed.
Status:
Accepted
Runtime: 4 ms
Submitted: 4 minutes ago