算法思想一:递归

解题思路:

主要通过对二叉树进行中序遍历朝招第K个节点
1、创建中序遍历存储数组 res
2、按照中序遍历:左子树-根节点-右子树,并将遍历的节点信息存储到res中
3、遍历结束,直接返回 res[k-1]
图解:

代码展示:

Python版本
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        # write code here
        # 中序遍历存储数组
        res = []
        # 中序递归函数
        self.inorder(pRoot, res)
        # 特殊情况
        if k == 0 or k > len(res):
            return None
        return res[k-1]
        
    def inorder(self, pRoot, res):
        # 二叉树为空
        if not pRoot:
            return res
        # 递归左子树
        self.inorder(pRoot.left, res)
        # 当前节点进入数组
        res.append(pRoot)
        # 递归左子树
        self.inorder(pRoot.right, res)

复杂度分析

时间复杂度O(N):N表示二叉树节点数量,递归遍历二叉树时间
空间复杂的O(N):辅助数组存储二叉树结点空间

算法思想二:非递归(栈)

解题思路:

主要通过中序遍历的过程查找第K个节点
1、定义辅助栈 stack,首先将根节点入栈,count为计算节点数量,初始化为0
2、循环:跳出条件 当前节点为空,栈为空
    1、依次将当前节点的左子树节点入栈
    2、再将栈内元素出栈,count += 1,如果count == k,则直接返回当前节点即可,否则,则将当前节点的右子树节点依次入栈
3、最后返回二叉树的第k个节点
图解:

代码展示:

JAVA版本
import java.util.Stack;
public class Solution {
    TreeNode KthNode(TreeNode pRoot, int k) {
        // 二叉树为空
        if (pRoot == null) {
			return null;
		}
        // 计数
		int count = 0;
        // 定义栈
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = null;
        // 循环结束条件
		while (!stack.isEmpty() || pRoot!=null) {
			while (pRoot != null) {
                // 入栈
				stack.push(pRoot);
				pRoot = pRoot.left;
			}
            // 出栈
			TreeNode node = stack.pop();
            // 计数
			count++;
            // 如果 count == k 说没找到第k个节点
			if (count == k) {
				temp = node;
			}
			pRoot = node.right;
		}
		return temp;
    }
}

复杂度分析

时间复杂度O(N):N表示二叉树节点数量,遍历二叉树所有节点时间
空间复杂的O(N):辅助栈最差情况下存储二叉树所有节点