二叉树的题目的解法归纳,加举例

先看一个例子,这是leetcode上一道中等难度的题。
在这里插入图片描述
思路:
根据中序遍历去找下一个节点就好,设置一个pre节点记录前一个位置。提供两种方法吧。
第一种是设置类成员pre和ans,这种方法较为简单直接,因为不必考虑递归的返回值问题。

class Solution {
    TreeNode pre,res;
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        f(root,p);
        return res;
    }
    public void f(TreeNode root,TreeNode p){
         if(root==null) return;
      f(root.left,p);
         if(pre==p) {
            res=root;
        }
        pre=root;
     f(root.right,p);
    }
}

第二种是仅设置类成员pre,这种方法稍微复杂一点点,需要考虑递归的返回值问题。其实也不复杂,递归嘛,首先要清楚递归函数的意义即找到目标节点,传入根节点,左子树找一下,接受一下结果,右子树找一下,接受一下结果,肯定只有一边找到吧,谁为空就返回另外一边即可。

class Solution {
    TreeNode pre;
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
       return f(root,p);
    }
    public TreeNode f(TreeNode root,TreeNode p){
         if(root==null) return null;
      TreeNode left=f(root.left,p);
      
         if(pre==p) {
            pre=root;
            return root;
        }
        pre=root;
        
     TreeNode right=f(root.right,p);
     return left==null?right:left;
    }
}

总结:其实树的问题都是一样的,核心都是遍历,三行代码,具体到题目无非是修改下遍历过程的操作,比如是打印输出,还是加入一个集合,等,有了框架,剩下的只是细节而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值