算法导论练习 10.4-5及12.1-3
生活随笔
收集整理的這篇文章主要介紹了
算法导论练习 10.4-5及12.1-3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//算法導論10.4-5及12.1-3
//1. 10.4-5
//給定一個n節點的二叉樹,寫出一個O(n)時間的非遞歸過程,將該樹每個節點的關鍵
//字輸出。要求除該樹本身的存儲空間外只能使用固定量的額外存儲空間,且在過程中
//不得修改該樹,及時暫時的修改也不允許。
//2. 12.1-3
//設計一個執行中序遍歷的非遞歸程序(提示:一種容易的方法是使用棧作為輔助數據
//結構;另一種比較復雜但比較簡潔的做法是不使用棧,但要假設能測試兩個指針是否
//相等。)
struct tree
{int val;tree *left,*right,*parent;
};void print(tree *x)
{cout<<x->val<<" ";
}
//最簡單的遞歸實現
void inorder_tree (tree *x)
{if(!x) return;inorder_tree (x->left);print(x);inorder_tree (x->right);
}//用棧輔助實習二叉樹非遞歸遍歷
//不需要使用父節點指針
stack<tree *> st;
void inorder_tree_stack(tree* x)
{while(x || !st.empty()) {//一路向左,不斷將當前節點壓入棧中while(x){st.push(x);x=x->left;}//取出棧頂元素,輸出,并遍歷其右節點x=st.top();st.pop();print(x);x=x->right;}
}
//非遞歸的中序遍歷樹,不用棧實現,但需要父節點指針
//一共有3種情況
//1. 訪問左孩子
//2. 訪問右孩子
//3. 如果是從右孩子返回,表明整棵子樹已訪問完,需要沿樹而上尋找父節點。
// 直到是從左孩子返回,或者訪問到根節點的父節點void inorder_tree_nostack(tree *x)
{if(!x) return;tree *y=NULL;while(true){//訪問左孩子if(y != x->left){while(x->left) x=x->left;}print(x);//訪問右孩子if(x->right){x=x->right;continue;}//回溯do{y=x;x=x->parent;//訪問到根節點的父節點(NULL)if(!x) return;}while(y == x->right);}
}
?
轉載于:https://www.cnblogs.com/blazebird/archive/2013/04/11/3015615.html
總結
以上是生活随笔為你收集整理的算法导论练习 10.4-5及12.1-3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.lang.ExceptionI
- 下一篇: ETL工具 kettle问题