給定乙個二叉樹,返回它的中序 遍歷。
輸入: [1,null,2,3]1\2/3輸出: [1,3,2]
1.最簡單也是最直接的,直接用遞迴演算法實現
classsolution
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 二叉樹的 垂序遍歷 從最左邊的列開始直到最右邊的列結束,按列索引每一列上的所有結點,形成...