LeetCode104—二叉树的最大深度
方法一:递归法求解二叉树深度,递归公式为h(root) = max(h(root->left), h(root->righr)) + 1,递归终止条件为树为空数即root = nullptr。
时间复杂度:二叉树中每个节点都要对其求二叉树最大深度,所以求二叉树最大深度函数执行次数为n,故时间复杂度为O(n)。
空间复杂度:在同一时刻只有一个函数在运行,函数执行过程中只需要几个临时变量,所以空间复杂度为O(1)。
1 int maxDepth(TreeNode* root) { 2 if (root == nullptr) return 0; //递归终止条件,树为空树 3 4 int leftChildTreeHeight = maxDepth(root->left); //左子树高度 5 int rightChildTreeHeight = maxDepth(root->right); //右子树高度 6 int height = ((leftChildTreeHeight > rightChildTreeHeight) ? leftChildTreeHeight : rightChildTreeHeight) + 1; //树的高度等于左右子树高度较大值加1 7 8 return height; 9 }
方法二:非递归实现,与层序遍历二叉树的思想类似,将根节点入队,然后循环判断队列是否为空,不为空队头元素出队,然后将队头元素的左右孩子结点依次入栈。在这个过程中维护两个量分别是:当前层在队列中的元素个数、下一层在队列中的元素个数,再循环中如果当前层在队列中的元素个数为0,那么深度加1。
时间复杂度:二叉树中每个节点都要出栈,所以循环执行次数为n,故时间复杂度为O(n)。
空间复杂度:函数运行过程总只用到一些临时变量,空间复杂度为O(1)。
1 int maxDepth(TreeNode* root) { 2 if (root == nullptr) return 0; //二叉树为空树 3 4 std::queue<TreeNode*> nodeQueue; //队列用于存放节点指针 5 TreeNode* pTempNodePtr = nullptr; 6 int currentTierNodeNum = 0; //当前层节点个数 7 int nextTierNodeNum = 0; //下一层节点个数 8 int depth = 0; //树的深度 9 10 nodeQueue.push(root); //将根节点入栈 11 ++currentTierNodeNum; 12 while (!nodeQueue.empty()) { 13 pTempNodePtr = nodeQueue.front(); //获取队头元素 14 nodeQueue.pop(); //队头元素出队 15 --currentTierNodeNum; 16 if (pTempNodePtr->left) { 17 nodeQueue.push(pTempNodePtr->left); //左孩子不为空入队 18 ++nextTierNodeNum; 19 } 20 if (pTempNodePtr->right) { 21 nodeQueue.push(pTempNodePtr->right); //右孩子不为空入队 22 ++nextTierNodeNum; 23 } 24 if (!currentTierNodeNum) { //当前层元素完全出队 25 currentTierNodeNum = nextTierNodeNum; //更新当前层元素个数 26 nextTierNodeNum = 0; 27 ++depth; 28 } 29 } 30 31 return depth; 32 }