leetcode116. 填充每个节点的下一个右侧节点指针

传送门

题目:给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;   
  Node *left;    
  Node *right;    
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。

方法1. 递归常数空间

	public Node connect(Node root) { 
        if (root == null) return null;
        Node leftNode = root.left, rightNode = root.right;
        // 把二叉树劈成两半, 在while循环里完成连接工作
        while (leftNode != null) { 
            leftNode.next = rightNode;
            leftNode = leftNode.right; //左节点的右儿子 连接上 右节点的左儿子 
            rightNode = rightNode.left;//根据完全二叉树的特性,不用rightNode判空
        }
        connect(root.left);
        connect(root.right);
        return root;
   }

方法2. 队列层次遍历 非常数空间

	public Node connect(Node root) {
        Queue<Node> que = new LinkedList<Node>();
        if(root == null) return null;
        que.offer(root);
        int curCount, nextCount = 1;
        while (que.size() != 0) {
            Node rightNode = null; 
            curCount = nextCount;
            nextCount = 0;
            while (que.size() != 0 && curCount-- > 0) {
                Node leftNode = que.poll(); // 左节点出队,
                leftNode.next = rightNode; // 左节点next指向右边节点
                rightNode = leftNode; // 右边节点更新为当前左节点(横向 平行向左移动)
                if (leftNode.right != null) { // 从 右往左 入队列
                    que.offer(leftNode.right);
                    nextCount++;
                } 
                if (leftNode.left != null) {
                    que.offer(leftNode.left);
                    nextCount++;
                } 
            }
        }
        return root;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值