每天1題演算法題(1) 二叉樹的中序遍歷

2022-09-17 08:21:14 字數 1586 閱讀 9600

給定乙個二叉樹,返回它的中序 遍歷。

輸入: [1,null,2,3]1\

2/3輸出: [1,3,2]

1.最簡單也是最直接的,直接用遞迴演算法實現

class

solution

public

void

dfs(treenode root, list list)

dfs(root.left, list);

list.add(root.val);

dfs(root.right, list);}}

缺點:

效率低下

2.用迭代模擬遞迴

class solution  else 

}return result;}}

缺點:

效率低下
3.莫里斯遍歷

用遞迴和迭代的方式都使用了輔助的空間,而莫里斯遍歷的優點是沒有使用任何輔助空間。

缺點是改變了整個樹的結構,強行把一棵二叉樹改成一段鍊錶結構。

//將root指向root的left

treenode tmp =root;

root =root.left;

tmp.left = null

;

//左子樹為空,則列印這個節點,並向右邊遍歷

} else

}return

res;}}

高階顏色標記法

其核心思想如下:

使用顏色標記節點的狀態,新節點為白色,已訪問的節點為灰色。

如果遇到的節點為白色,則將其標記為灰色,然後將其右子節點、自身、左子節點依次入棧。

如果遇到的節點為灰色,則將節點的值輸出。

class solution 

}public listinordertr**ersal(treenode root)

stackstack = new stack();

stack.push(new colornode("white", root));

while(stack.size() > 0)

stack.add(new colornode("grey", colornode.treenode));

if(colornode.treenode.left != null)

} else

}return result;

}

如要實現前序、後序遍歷,只需要調整左右子節點的入棧順序即可。

每天1題演算法題(5) 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為乙個單鏈表。解答 將二叉樹展開為單鏈表之後,單鏈表中的節點順序即為二叉樹的前序遍歷訪問各節點的順序 遞迴實現 class solution private void preorder treenode node,listtreenodelist treenodelist...

演算法題 二叉樹的中序遍歷

題目描述 給定乙個二叉樹,返回它的中序 遍歷。示例 輸入 1,null,2,3 1 2 3輸出 1,3,2 高階 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?解法一通過遞迴實現。時間複雜度 o n 空間複雜度 平均是o logn 樹的高度 最壞是o n 當樹退化成煉表時 definition fo...

演算法題 二叉樹的垂序遍歷

給你二叉樹的根結點 root 請你設計演算法計算二叉樹的 垂序遍歷 序列。對位於 row,col 的每個結點而言,其左右子結點分別位於 row 1,col 1 和 row 1,col 1 樹的根結點位於 0,0 二叉樹的 垂序遍歷 從最左邊的列開始直到最右邊的列結束,按列索引每一列上的所有結點,形成...