1. 程式人生 > 實用技巧 >RabbitMq簡單學習記錄

RabbitMq簡單學習記錄

二叉樹遍歷的說明

使用前序,中序和後序對二叉樹進行遍歷:

1. 前序遍歷: 先輸出父節點,再遍歷左子樹和右子樹(父左右)

2. 中序遍歷: 先遍歷左子樹,再輸出父節點,再遍歷右子樹(左父右)

3. 後序遍歷: 先遍歷左子樹,再遍歷右子樹,最後輸出父節點(左右父)

小結: 看輸出父節點的順序,就確定是前序,中序還是後序

根據遍歷序列確定二叉樹

由二叉樹的先序序列中序序列

1. 在先序序列中,第一個結點一定是二叉樹的根結點

2. 在中序序列中,根結點必然將中序序列分割成兩個子序列;前一個子序列是根結點的左子樹的中序序列,後一個是右子樹的

3. 根據這兩個子序列,在先序序列中找到對應的左右子序列

4. 在先序序列中,左子序列的第一個結點是左子樹的根結點,右子序列同理

5. 如此遞迴下去

• 總結:先序配合中序時,中序負責找左右子序列,先序負責找子樹的根節點

由二叉樹的中序序列後序序列

1. 在後序序列,根結點在序列尾部

2. 在中序序列,根結點必在其中間,左邊是左子樹子孫,右邊同理

3. 根據這兩個子序列,在後序序列找到對應的左右序列

4. 在後序序列中,左子序列的尾結點是左子樹的根結點,右子序列同理

5. 如此遞迴下去

• 總結:後序配合中序時,中序負責找左右子序列,後序負責找子樹的根結點

注意:根據先序序列和後序序列是不能確定一個二叉樹的

綜上所述:

  • 配合中序序列時,先序和後序都是確定子樹的根結點,區別是根結點在其子序列的位置(先序是子序列的第一個,後序是子序列的最後一個);
  • 中序序列都是在先或後序序列找到根結點後,找到左右子序列

二叉樹節點程式碼實現

1. classBoy{
2. privatecharid;
3. privateStringname;
4. privateBoyleft;//左子節點,預設為 null 
5. privateBoyright;//右子節點,預設為 null 
6. 
7. 
8. publicBoy(charid,Stringname){
9. this.id=id;
10. this.name=name;
11. } 12. 13. publicvoidsetId(charid){ 14. this.id=id; 15. } 16. 17. publicintgetId(){ 18. returnid; 19. } 20. 21. 22. publicStringgetName(){ 23. returnname; 24. } 25. 26. publicvoidsetName(Stringname){ 27. this.name=name; 28. } 29. 30. publicBoygetLeft(){ 31. returnleft; 32. } 33. 34. publicvoidsetLeft(Boyleft){ 35. this.left=left; 36. } 37. 38. publicBoygetRight(){ 39. returnright; 40. } 41. 42. publicvoidsetRight(Boyright){ 43. this.right=right; 44. } 45. 46. @Override 47. publicStringtoString(){ 48. return"Boy{"+ 49. "id="+id+ 50. ",name='"+name+'\''+ 51. '}'; 52. } 53. }

前序遍歷程式碼實現

1. classPostOrder{
2. publicstaticvoidpostOrder(Boyboy){
3. if(boy==null){
4. System.out.println("二叉樹為空,無法遍歷");
5. return;
6. }
7. System.out.println(boy);//先輸出父結點
8. if(boy.getLeft()!=null){//遞歸向左子樹前序遍歷
9. postOrder(boy.getLeft());
10. }
11. if(boy.getRight()!=null){//遞歸向右子樹中序遍歷
12. postOrder(boy.getRight());
13. }
14. }
15. 
16. }

中序遍歷程式碼實現

1. classInfixOrder{
2. publicstaticvoidinfixOrder(Boyboy){
3. if(boy==null){
4. System.out.println("二叉樹為空,無法遍歷");
5. return;
6. }
7. if(boy.getLeft()!=null){//遞歸向左子樹中序遍歷
8. infixOrder(boy.getLeft());
9. }
10. System.out.println(boy);//輸出父結點
11. if(boy.getRight()!=null){//遞歸向右子樹中序遍歷
12. infixOrder(boy.getRight());
13. }
14. }
15. }

後序遍歷程式碼實現

1. classLastOrder{
2. publicstaticvoidlastOrder(Boyboy){
3. if(boy==null){
4. System.out.println("二叉樹為空,無法遍歷");
5. return;
6. }
7. if(boy.getLeft()!=null){//遞歸向左子樹中序遍歷
8. lastOrder(boy.getLeft());
9. }
10. if(boy.getRight()!=null){//遞歸向右子樹中序遍歷
11. lastOrder(boy.getRight());
12. }
13. System.out.println(boy);//輸出父結點
14. }
15. }