力扣:翻转二叉树java

力扣:翻转二叉树java

力扣:翻转二叉树java_第1张图片

思路:

1.选择合适的遍历方式:最容易的是递归的先序和后序遍历,然后是迭代的先后序遍历,其次是层序遍历,最后是中序遍历(需要遍历的将取右节点改成左节点)
2.思考操作逻辑,实际上就是对二叉树所有节点左右孩子互换。

class Solution {
    public TreeNode invertTree(TreeNode root) {//主函数
        if(root == null) return root;
        swapTree3(root);//调用翻转函数传入根节点
        return root;
    }
    public void swapTree(TreeNode cur){//递归先序遍历,也可以使用后序遍历
        if(cur == null) return;//结束条件
        TreeNode tempNode = cur.left;//对节点操作,互换节点的左右孩子
        cur.left = cur.right;
        cur.right = tempNode;
        swapTree(cur.left);//递归遍历左右孩子
        swapTree(cur.right);
    }
    public void swapTree2(TreeNode cur){//迭代先序遍历
        Stack<TreeNode> st = new Stack<>();//设置一个栈
        st.push(cur);//根节点入栈
        while(!st.isEmpty()){//栈不为空时,说明未遍历完成
            TreeNode node = st.pop();//栈弹出一个节点
            if(node!=null){  //该节点不为空,就进行互换左右孩子操作
                TreeNode tempNode = node.left;
                node.left = node.right;
                node.right = tempNode;
            }else{//为空则跳过本次循环
                continue;
            }   
            st.push(node.right);//对左右孩子入栈
            st.push(node.left);
        }
    }
    public void swapTree3(TreeNode cur){//层序遍历
        Queue<TreeNode> queue = new LinkedList<>();//设置一个对列
        queue.offer(cur);//输入根节点,也就是第一层进入对列中
        while(!queue.isEmpty()){//对列不为空,说明还有二叉树层未遍历
            int len = queue.size();//获取对列的长度,也就是一层的个数
            while(len>0){//循环层数的长度次,弹出本层的所有节点
                TreeNode node = queue.poll();//得到出队列操作的节点
                TreeNode tempNode = node.left;//对该节点左右孩子互换
                node.left = node.right;
                node.right = tempNode;
                if(node.left!=null) queue.offer(node.left);//该节点存在左右孩子就输入对列
                if(node.right!=null) queue.offer(node.right);
                len--;

            }
        }
    }
}

你可能感兴趣的:(java,leetcode,算法)