我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/distinct-subsequences/description/
题目描述:
知识点:树的深度优先遍历
思路一:递归实现
用一个链表linkedList来存储每一层的某个结点,即linkedList[i]代表第i层的一个节点,最终linkedList[i]中存储的将会是第i层的最右边的那个节点。
在递归的过程中,一旦linkedList[level]上有了值,就需要将该值替换为新的值,并将旧节点的next指向新节点。
时间复杂度是O(n),其中n为树中的节点个数。空间复杂度即递归深度,是O(h),其中h为树的高度。
JAVA代码:
public class Solution {
public void connect(TreeLinkNode root) {
LinkedList<TreeLinkNode> linkedList = new LinkedList<>(); //linkedList[i]用来存储第i层的一个节点
dfs(root, 0, linkedList);
}
private void dfs(TreeLinkNode root, int level, LinkedList<TreeLinkNode> linkedList){
if(null == root){ //如果root为null,直接返回
return;
}
if(linkedList.size() <= level){
linkedList.add(root);
}else{
TreeLinkNode treeLinkNode = linkedList.get(level);
treeLinkNode.next = root;
linkedList.remove(level);
linkedList.add(level, root);
}
dfs(root.left, level + 1, linkedList);
dfs(root.right, level + 1, linkedList);
}
}
LeetCode解题报告:
思路二:非递归实现
用pre指针指向当前节点cur的父亲节点,只要cur不为null,就进行下述循环,用变量level记录层数。
(1)如果cur == pre.left,即cur是pre的左孩子,显然,其next值应该指向pre.right,再令cur = cur.next。
(2)如果cur != pre.left,
a:如果cur == pre.right且pre.next不为null,我们令当前节点的指针指向pre.next.left,即其父亲节点的next节点的左孩子。再令cur = cur.next,此时还需要更新pre的值为pre.next。
b:否则,说明我们已经遍历到了当前层的最右边的节点,我们更新层数level++,再令pre指向当前已遍历层的最左侧节点,而令cur指向下一层的最左侧节点,即pre.left。
时间复杂度是O(n),其中n为树中的节点个数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public void connect(TreeLinkNode root) {
if(null == root){
return;
}
TreeLinkNode pre = root;
TreeLinkNode cur = pre.left;
int level = 0;
while(null != cur){
if(cur == pre.left){
cur.next = pre.right;
cur = cur.next;
}else{
if(cur == pre.right && null != pre.next){
cur.next = pre.next.left;
cur = cur.next;
pre = pre.next;
}else{
pre = root;
level++;
for(int i = 0; i < level; i++){
pre = pre.left;
}
cur = pre.left;
}
}
}
}
}
LeetCode解题报告:
思路三:对思路二的改进
思路二中,步骤(2)-b令pre指向当前已遍历层的最左侧节点的过程中,不仅需要记录层数,而且需要一个for循环,我们完全可以用一个额外的first指针保存当前层的首节点信息。
时间复杂度是O(n),其中n为树中的节点个数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public void connect(TreeLinkNode root) {
if (null == root) {
return;
}
TreeLinkNode first = root;
while(null != first) {
TreeLinkNode p = first;
TreeLinkNode cur = null;
first = p.left;
while (null != p) {
if(null != cur) {
cur.next = p.left;
cur = cur.next;
}else{
cur = p.left;
}
if(null != cur) {
cur.next = p.right;
cur = cur.next;
}
p = p.next;
}
}
}
}
LeetCode解题报告: