Likou selected top interview questions -------- symmetrical binary tree

Insert picture description here
Symmetric Binary Tree

Idea: This
question is still a binary tree traversal question. Almost all binary tree questions are essentially traversal, and the code can be modified on the basis of traversal. The specific steps can be seen in the code and will not be described again.

Code:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    
    
public:


    bool dfs(TreeNode* left,TreeNode* right){
    
    
        if(left==NULL && right==NULL ){
    
    
            return true;
        }

        if(left==NULL || right==NULL ) return false;
        if(left->val == right->val) return dfs(left->left,right->right) && dfs(left->right,right->left);  这里就要看看其孩子的情况了
        else{
    
    
            return false;
        }
    }
    bool isSymmetric(TreeNode* root) {
    
    
        if(root==NULL) return false;
        return dfs(root->left,root->right);
    }
};

//非递归版本
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
	public boolean isSymmetric(TreeNode root) {
    
    
		if(root==null || (root.left==null && root.right==null)) {
    
    
			return true;
		}
		//用队列保存节点
		LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
		//将根节点的左右孩子放到队列中
		queue.add(root.left);
		queue.add(root.right);
		while(queue.size()>0) {
    
    
			//从队列中取出两个节点,再比较这两个节点
			TreeNode left = queue.removeFirst();
			TreeNode right = queue.removeFirst();
			//如果两个节点都为空就继续循环,两者有一个为空就返回false
			if(left==null && right==null) {
    
    
				continue;
			}
			if(left==null || right==null) {
    
    
				return false;
			}
			if(left.val!=right.val) {
    
    
				return false;
			}
			//将左节点的左孩子, 右节点的右孩子放入队列
			queue.add(left.left);
			queue.add(right.right);
			//将左节点的右孩子,右节点的左孩子放入队列
			queue.add(left.right);
			queue.add(right.left);
		}
		
		return true;
	}
}

Guess you like

Origin blog.csdn.net/weixin_43743711/article/details/114026389