翻转二叉树
直接做指针交换即可,前序或后序都用递归的思路来解决,(即针对同一个问题使用同一套逻辑)因为中间结点都是独立于交换后的顺序而存在的。
注意,还是先进栈后处理,所以前序遍历中右结点先进栈
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return root;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
st.pop();
swap(node->left,node->right);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return root;
}
};
对称二叉树
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,这便是与上题的逻辑共通之处
这里比较的不是同一个结点的左孩子和右孩子,而是传入比较的两个结点,比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。如果左右都对称就返回true ,有一侧不对称就返回false 。
使用的遍历方式,左子树左右中,右子树右左中
求二叉树的最大深度和最小深度
这里注意,如果是queue的话,操作就如下:
而如果定义的是deque(双向队列)的话
!!!