LeetCode——Symmetric Tree

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

» Solve this problem


中序遍历树,看是否为回文串。注意,如评论所说,该方法存在错误。


/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    vector<int> vals;
    
    void traverse(TreeNode *root) {
        if (root == NULL) {
            return;
        }
        traverse(root->left);
        vals.push_back(root->val);        
        traverse(root->right);
    }
public:
    bool isSymmetric(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (root == NULL) {
            return true;
        }
        vals.clear();
        traverse(root);        
        for (int i = 0; i < vals.size() / 2; i++) {
            if (vals[i] != vals[vals.size() - i - 1]) {
                return false;
            }
        }        
        return true;
    }
};

产生错误的原因:回文串丢失了层次,位置信息。


我采用了一种笨方法解决了这个问题,那便是逐层检查逐层扩展,检查每一层的节点是否互相对称。


import java.util.ArrayList;
import java.util.List;

public class Solution {
	class ExtTreeNode {
		TreeNode node;
		long pos;

		ExtTreeNode(TreeNode node, long pos) {
			this.node = node;
			this.pos = pos;
		}
	}

    public boolean isSymmetric(TreeNode root) {
    	if (root == null) {
    		return true;
    	}
    	List<ExtTreeNode> lNodes, rNodes, lTempNodes, rTempNodes;
    	lNodes = new ArrayList<ExtTreeNode>();
    	rNodes = new ArrayList<ExtTreeNode>();
    	if (root.left != null) {
    		lNodes.add(new ExtTreeNode(root.left, 1));
    	}
    	if (root.right != null) {
    		rNodes.add(new ExtTreeNode(root.right, 2));
    	}
    	int count = 2;
    	while (lNodes.size() > 0) {
    		if (rNodes.size() == 0 || rNodes.size() != lNodes.size()) {
    			return false;
    		}
    		lTempNodes = new ArrayList<ExtTreeNode>();
    		rTempNodes = new ArrayList<ExtTreeNode>();
    		for (int i = 0; i < lNodes.size(); i++) {
    			ExtTreeNode lNode = lNodes.get(i);
    			ExtTreeNode rNode = rNodes.get(i);
    			if (lNode.pos + rNode.pos != count + 1 || lNode.node.val != rNode.node.val) {
    				return false;
    			}

    			if (lNode.node.left != null) {
    				lTempNodes.add(new ExtTreeNode(lNode.node.left, lNode.pos * 2 - 1));
    			}
    			if (lNode.node.right != null) {
    				lTempNodes.add(new ExtTreeNode(lNode.node.right, lNode.pos * 2));
    			}
    			if (rNode.node.right != null) {
    				rTempNodes.add(new ExtTreeNode(rNode.node.right, rNode.pos * 2));
    			}
    			if (rNode.node.left != null) {
    				rTempNodes.add(new ExtTreeNode(rNode.node.left, rNode.pos * 2 - 1));
    			}
    		}
    		lNodes = lTempNodes;
    		rNodes = rTempNodes;
    		count *= 2;
    	}
    	return rNodes.size() == 0;
    }
}



在LeetCode的讨论中存在更简洁的方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值