重寫棧遍歷
#includeusing namespace std;
struct binarytreenode
};void connecttreenode(binarytreenode* pnode,binarytreenode* pleft,binarytreenode* pright) //父結點為空出錯
pnode->m_pleft=pleft; //賦左兒
pnode->m_pright=pright; //賦右兒
}void visit(binarytreenode* pnode)//訪問結點,非空就輸出其值
void preorderwithstack(binarytreenode* proot)
}void inorderwithstack(binarytreenode* proot)
else
}}void postorderwithstack(binarytreenode* proot)
else
}else
}}int main()
};void connecttreenode(binarytreenode* pnode,binarytreenode* pleft,binarytreenode* pright) //父結點為空出錯
pnode->m_pleft=pleft; //賦左兒
pnode->m_pright=pright; //賦右兒
}void visit(binarytreenode* pnode)//訪問結點,非空就輸出其值
void preorderrecursion(binarytreenode* proot)
void inorderrecursion(binarytreenode* proot)
void postorderrecursion(binarytreenode* proot)
void preorderwithstack(binarytreenode* proot)//遍歷完了左子樹以後,從最後入棧的結點開始,檢查它是否有右子樹
if(!st.empty()) //遍歷思想:對每個點都先走到其最左下的兒子,然後是按輸出的逆次序逐個點訪問其右兒
} //如果存在右兒,又走到其右兒的最左下的兒子,然是繼續按照當前輸出的逆次序逐個點訪問
} //如果操作點是空的,就讀棧吧,可以保證棧頂讀出來的結點是沒有左兒子的
void inorderwithstack(binarytreenode* proot)//每次操作的點都只能入棧不能輸出
if(!st.empty()) //遍歷思想:對每個點都先走到其最左下的結點,路徑的點全壓入棧裡,然後輸出棧頂,遞迴到右兒子
} //對右兒子走到其最左下的結點,路徑的點全壓入棧裡,然後輸出棧頂,如此類推
} //一句話:遍歷左子樹,出棧訪問結點,遍歷右子樹
void postorderwithstack(binarytreenode* proot)else
else//遍歷思想:對每個點都先走到其最左下的結點,路徑的點全壓入棧裡,然後依次逆序讀出棧頂元素
}//如果有右兒,遞迴到右兒子,繼續走到其最左下的結點,路徑的點也全壓入棧裡
}//如果讀到的棧頂元素沒有右兒,直接輸出並打上已訪問標記!關鍵在這裡:作用是此結點為其老豆的右兒時,其老豆第二次出棧要判斷右兒是否已訪問
}//因為其老豆第一次從棧頂讀出時判到有右兒就會不出棧,且往右兒遞迴,則當右兒遞迴完之後要打個標記讓老豆知道
void levelorder(binarytreenode* proot)
}int main()
*/
樹的遍歷 樹的遍歷(PTA)
給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。7 2...
樹及樹的遍歷
幾個概念和性質 樹可以沒有結點,此情況下稱為空樹 empty tree 樹的層次 layer 從根結點開始算起,即根節點為第一層 把節點的子樹棵樹稱為結點的度 degree 而樹中結點的最大值的度稱為樹的度 樹的邊數等於結點數減1,反之,滿足連通且邊數等於結點數減1即為樹 結點深度自頂向下累加,結點...
LeetCode 二叉樹1 樹的遍歷
note 後序遍歷在表示式上的應用 用遞迴的方式遍歷二叉樹 note 遞迴的實現方式裡,函式的返回值需要為void型別,否則沒法進行。所以我們需要設定乙個help函式來完成遞迴。後序遍歷 definition for a binary tree node.struct treenode class ...