在前文 二叉树的遍历 中,讨论了二叉树的三种遍历方式的递归和非递归实现,以及层次遍历的实现。本文在此基础之上,来讨论面试题中,关于求二叉树节点类的面试题。此类题目,有二叉树的遍历算法改造而求解。
全文结构如下:
对应的oj练习地址如下:
1.二叉树的节点个数 - leetcode222
2.二叉树的下一个结点_牛客网
3.二叉搜索树的最近公共祖先-Leetcode235
4.二叉树的最近公共祖先-leetcode236
5.二叉搜索树中第K小的元素-leetcode230
1.二叉树中节点的个数
递归解法:
1)如果二叉树为空,节点个数为0
2)如果不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1
递归代码如下:
class Solution {
public int countNodes(TreeNode root) {
if(root==null){
return 0;
}
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
非递归解法:
1)选择一种非递归遍历二叉树的方法。
2)在遍历的时候,设置一个计数器进行计数。
基于中序遍历的非递归解法代码如下
class Solution {
public int countNodes(TreeNode root) {
if(root == null)
return 0;
Stack<TreeNode> stack = new Stack<>();
int count=0;
stack.push(root);
while(!stack.isEmpty()){
r