二叉树 104,111, 226, 100

二叉树具有天然的递归结构。

1. 前序遍历

void preorder(TreeNode* node){
    if(node){
        cout<< node->val;
        preorder(node->left);
        preorder(node->right);
    }
}

或这样写:

void preorder(TreeNode* node){
  //递归终止条件
if( node==NULL ) return;
  //递归过程 cout
<< node->val; preorder(node->left); preorder(node->right); }

空是一颗二叉树。

2. 查找某个键值key

bool contain(Node* node, Key key){
    //终止条件
    if(node == NULL)
        return false;
    if(key==node->key)
        return true;
    if(contain(node->left, key) || contain(node->right, key))
        return true;
    return false;
}

3. 删除二叉树

void destroy(Node* node){
    if(node == NULL)
        return;
    destroy(node->left);
    destroy(node->right);
    delete node;
    count--;
}

/**
 * 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:
    int maxDepth(TreeNode* root) {
        //递归终止条件
        if(root == NULL)
            return 0;
        
        //当前结点左子树最高的高度
        int leftMaxDepth = maxDepth(root->left);
        int rightMaxDepth = maxDepth(root->right);
        return max(leftMaxDepth, rightMaxDepth)+1;

    /*也可直接写为
    return max(maxDepth(root->left), maxDepth(root->right))+1;
    */ } };

思路:DFS+递归

1)若当前结点若为空,则返回0;

2)若当前结点的左子树为空,则对右子树调用递归函数,并加1返回;

3)若当前结点的右子树为空,则对左子树调用递归函数,并加1返回;

4)若当前结点的左右子树都不为空,则对他们分别调用递归函数,并将二者的较小值加1返回。

 

/**
 * 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:
    int minDepth(TreeNode* root) {
        if(root==NULL) return 0;
        
        if(root->left && root->right)
            return min(minDepth(root->right), minDepth(root->left))+1;
        else
            return max(minDepth(root->right), minDepth(root->left))+1;
    }
};

 

/**
 * 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:
    int minDepth(TreeNode* root) {
        if(root == NULL) return 0;
        if(root->left == NULL)
            return minDepth(root->right)+1;
        if(root->right == NULL)
            return minDepth(root->left)+1;
        return min(minDepth(root->left), minDepth(root->right))+1;
    }
};

 

/**
 * 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) {
        if(root == NULL)
            return NULL;
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left, root->right);
        
        return root;
    }
};

 

 

/**
 * 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:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q)
            return true;
        else if(!p && q)
            return false;
        else if(p && !q)
            return false;
        else{
            if(p->val != q->val)
                return false;
            else
                return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        }
    }
};

思路:判断二叉树是否是镜面对称的,比如有两个节点n1, n2,我们需要比较n1的左子节点的值和n2的右子节点的值是否相等,同时还要比较n1的右子节点的值和n2的左子结点的值是否相等,以此类推比较完所有的左右两个节点。

 

/**
 * 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:
    bool isSymmetric(TreeNode* root) {
        if(!root)
            return true;
        return symmetric(root->left, root->right);
    }
     bool symmetric(TreeNode* left, TreeNode* right){
         if(!left && !right) return true;
         if(left && !right || !left && right || left->val != right->val)
             return false;
         return symmetric(left->left, right->right) && symmetric(left->right, right->left);
         
     }
};

 

                                                                                                                                                                                                                                         

 

posted @ 2019-02-24 15:05  爱学英语的程序媛  阅读(178)  评论(0编辑  收藏  举报