找树左下角的值, 路径总和 , 从中序与后序遍历序列构造二叉树

1.找树左下角的值 leetcode

找出 最后一行 最左边 的 值 ,也就是 深度 最深 的的 节点

class Solution {
public:
    int maxheight = INT_MIN;
    int result;
    void num ( TreeNode* cur , int height ) {
        if ( cur -> right == NULL && cur -> left == NULL ) {
            if ( height > maxheight ) {
                maxheight = height;
                result = cur -> val;
            }
            return ;
        }  
        if ( cur -> left ) num ( cur -> left , height + 1 );
        if ( cur -> right ) num ( cur -> right , height + 1 ); 
        return ;
        
        
    }
    int findBottomLeftValue(TreeNode* root) {
        num( root , 0);
        return result;

    }
};

 num ( cur -> left , height + 1 ) 这语句 实际上 height 并没有改变 , 传参 传的 height+ 1 

递归中 都 带着 回溯 , 可以模拟回溯的过程

if (root->left) {   // 左
    depth++; // 深度加一
    traversal(root->left, depth);
    depth--; // 回溯,深度减一
}
if (root->right) { // 右
    depth++; // 深度加一
    traversal(root->right, depth);
    depth--; // 回溯,深度减一
}

2.路径总和 leetcode

找到一条路径 值相加 等于所给target , 如果有返回 true  , 没有 返回false


class Solution {
public:
    bool work( TreeNode* cur , int targer ) {
        if ( cur -> right == NULL && cur -> left == NULL && targer == 0 )return true;
        if (cur -> right == NULL && cur -> left == NULL && targer != 0) return false;
        if ( cur -> left ) {
           if ( work( cur -> left , targer - cur -> left -> val) ) return true;
        }
        if ( cur -> right ) {
           if ( work( cur -> right , targer - cur -> right -> val) ) return true;
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if ( root == NULL ) return false;
        else return work( root , targetSum - root -> val );
 
    }
};

3.从中序与后序遍历序列构造二叉树 leetcode

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,构造并返回这颗 二叉树

  • 第一步:如果数组大小为零的话,说明是空节点了。

  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

  • 第五步:切割后序数组,切成后序左数组和后序右数组

  • 第六步:递归处理左区间和右区间

class Solution {
public:
    TreeNode* Tree( vector < int > &inorder , vector < int > & postorder ) {
        if ( postorder.size() == 0 ) return NULL ;
        int mid = postorder[ postorder.size() - 1 ];
        TreeNode* root = new TreeNode(mid);
        int i;
        for ( i = 0 ; i < inorder.size() ; i++ ) {
            if ( inorder[i] == mid )break;
        }
        vector < int > leftinorder( inorder.begin() , inorder.begin() + i );
        vector < int > rightinorder( inorder.begin() + i + 1, inorder.end() );

        postorder.erase( postorder.begin() + postorder.size() - 1);

        vector < int > leftpostorder ( postorder.begin() , postorder.begin() + leftinorder.size() );
        vector < int > rightpostorder ( postorder.begin() + leftinorder.size() , postorder.end() );
        
        root -> left = Tree( leftinorder , leftpostorder );
        root -> right = Tree ( rightinorder , rightpostorder );
        return root;

    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return Tree ( inorder , postorder );
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值