給定乙個n個節點的二叉樹,完成前、中、後序遍歷,要求時間複雜度為o(n),額外空間複雜度為o(1)
二叉樹遞迴/非遞迴遍歷
(1)如果當前節點的左子樹為空,則當前節點向右移動
(2)如果當前節點的左子樹不為空,則找到左子樹上最右的節點
a.如果最右節點的右孩子為空,則將最右節點的右孩子指向當前節點,當前節點向左移動
b.如果最後節點的右孩子指向當前節點,則將最右節點的右孩子指向空,當前節點向右移動
void
morris
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cur = cur-
>right;
}}
morris遍歷整個過程最多到達乙個節點兩次,前中序遍歷只是輸出的時機不同
第一次到達該節點就輸出
void
morrispre
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
}else
cur = cur-
>right;
} cout << endl;
}
第二次到達該節點就輸出
void
morrisin
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cout << cur-
>data;
cur = cur-
>right;
} cout << endl;
}
由於後序遍歷的輸出時機是第三次到達乙個節點,但是morris遍歷最多只能到達乙個節點兩次,因此需要特殊處理。
對於可以到達兩次的節點,在第二次到達時逆序輸出該節點的左子樹的右邊界。
最後輸出整棵樹的右邊界即可。
對於逆序輸出,由於額外空間的限制我們需要進行類似於單鏈表反轉的操作。
node*
reverseedge
(node *node)
return pre;
}
void
morrispos
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cur = cur-
>right;
}printright
(head)
; cout << endl;
}
#include
#include
#include
using
namespace std;
typedef
struct node
}node;
node*
reverseedge
(node *node)
return pre;
}void
printright
(node *node)
reverseedge
(tail);}
void
morris
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cur = cur-
>right;}}
void
morrispre
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
}else
cur = cur-
>right;
} cout << endl;
}void
morrisin
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cout << cur-
>data;
cur = cur-
>right;
} cout << endl;
}void
morrispos
(node *head)
if(mostright-
>right ==
null
)else
if(mostright-
>right == cur)
} cur = cur-
>right;
}printright
(head)
; cout << endl;
}void
createbtree
(node*
&node)
else
}//abd##fe###cg#h##i##
intmain()
Morris遍歷二叉樹
morris遍歷的實質就是避免用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標指回上層的某個節點,從而完成下層到上層的移動。中序遍歷的過程如下 1.假設當前子樹的頭節點為h,讓h的左子樹中最右節點的right指標指向h,然後h的左子樹繼續步驟1的處理過程,直到遇到某乙個節...
Morris遍歷(二叉樹)
對於每乙個節點來說 對於上面這副圖來說,整個過程 進入節點5 構建 4 5右連線 進入節點3 構建 1 3右連線 進入節點1 列印1 通過 1 3 連線進入3 進入節點3 第二次進入3,列印3 進入節點4 列印4 通過 4 5 連線進入5 進入節點5 第二次進入5,列印5 注意 中序遍歷利用右子節點...
Morris演算法遍歷二叉樹
中序遍歷 演算法步驟 1 如果當前節點的左子節點為空,則輸出當前節點,並將當前節點置為該節點的右子節點。2如果當前節點的左子節點不為空時,則找到當前節點左子樹的最右節點 該節點為當前節點中序遍歷的前驅節點 a 如果最右節點的右指標為空,則將最右節點的右指標指向當前節點,並把當前節點置為其左子節點。b...