日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树节点的遍历,查找,删除(前序,中序,后序)

發(fā)布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树节点的遍历,查找,删除(前序,中序,后序) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹模板類:

class BinaryTree {private Node root;public void setRoot(Node root) {this.root = root;}//刪除結點public void delNode(int no) {}//前序遍歷public void preOrder() {}//中序遍歷public void infixOrder() {}//后序遍歷public void postOrder() {}//前序遍歷public HeroNode preOrderSearch(int no) {}//中序遍歷public HeroNode infixOrderSearch(int no) {}//后序遍歷public HeroNode postOrderSearch(int no) {} }

樹節(jié)點模板類:

class HeroNode {private int no;private String name;private HeroNode left; //默認nullprivate HeroNode right; //默認null

1.遍歷

樹的遍歷分為: 廣度優(yōu)先遍歷:一層一層從左到右進行遍歷(借助隊列) 深度優(yōu)先遍歷:①先序遍歷、每個結點的遍歷都滿足根結點、左結點、右結點(均借助棧)②中序遍歷、每個結點的遍歷都滿足左結點、根結點、右結點③后序遍歷、每個結點的遍歷都滿足左結點、右結點、根結點

  • 前序遍歷:先輸出父節(jié)點,再遍歷左子樹和右子樹
public void preOrder() {if(this.root != null) {this.root.preOrder();}else {System.out.println("二叉樹為空,無法遍歷");}}
  • 中序遍歷:先遍歷左子樹,再輸出父節(jié)點,再遍歷右子樹
public void infixOrder() {if(this.root != null) {this.root.infixOrder();}else {System.out.println("二叉樹為空,無法遍歷");}}
  • 后序遍歷:先輸出左子樹,再遍歷右子樹 ,最后輸出父節(jié)點
public void postOrder() {if(this.root != null) {this.root.postOrder();}else {System.out.println("二叉樹為空,無法遍歷");}}

2.查找

  • 前序查找
public Node preOrderSearch(int no) {System.out.println("進入前序遍歷");//比較當前結點是不是if(this.no == no) {return this;}//1.則判斷當前結點的左子節(jié)點是否為空,如果不為空,則遞歸前序查找//2.如果左遞歸前序查找,找到結點,則返回Node resNode = null;if(this.left != null) {resNode = this.left.preOrderSearch(no);}if(resNode != null) {//說明我們左子樹找到return resNode;}//1.左遞歸前序查找,找到結點,則返回,否繼續(xù)判斷,//2.當前的結點的右子節(jié)點是否為空,如果不空,則繼續(xù)向右遞歸前序查找if(this.right != null) {resNode = this.right.preOrderSearch(no);}return resNode;}
  • 中序查找
public Node infixOrderSearch(int no) {//判斷當前結點的左子節(jié)點是否為空,如果不為空,則遞歸中序查找Node resNode = null;if(this.left != null) {resNode = this.left.infixOrderSearch(no);}if(resNode != null) {return resNode;}System.out.println("進入中序查找");//如果找到,則返回,如果沒有找到,就和當前結點比較,如果是則返回當前結點if(this.no == no) {return this;}//否則繼續(xù)進行右遞歸的中序查找if(this.right != null) {resNode = this.right.infixOrderSearch(no);}return resNode;}
  • 后序查找
public Node postOrderSearch(int no) {//判斷當前結點的左子節(jié)點是否為空,如果不為空,則遞歸后序查找Node resNode = null;if(this.left != null) {resNode = this.left.postOrderSearch(no);}if(resNode != null) {//說明在左子樹找到return resNode;}//如果左子樹沒有找到,則向右子樹遞歸進行后序遍歷查找if(this.right != null) {resNode = this.right.postOrderSearch(no);}if(resNode != null) {return resNode;}System.out.println("進入后序查找");//如果左右子樹都沒有找到,就比較當前結點是不是if(this.no == no) {return this;}return resNode;}

3. 刪除節(jié)點(基于無序的二叉樹)

//遞歸刪除結點//1.如果刪除的節(jié)點是葉子節(jié)點,則刪除該節(jié)點//2.如果刪除的節(jié)點是非葉子節(jié)點,則刪除該子樹public void delNode(int no) {//思路/** 1. 因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除結點,而不能去判斷當前這個結點是不是需要刪除結點.2. 如果當前結點的左子結點不為空,并且左子結點 就是要刪除結點,就將this.left = null; 并且就返回(結束遞歸刪除)3. 如果當前結點的右子結點不為空,并且右子結點 就是要刪除結點,就將this.right= null ;并且就返回(結束遞歸刪除)4. 如果第2和第3步?jīng)]有刪除結點,那么我們就需要向左子樹進行遞歸刪除5. 如果第4步也沒有刪除結點,則應當向右子樹進行遞歸刪除.*///2. 如果當前結點的左子結點不為空,并且左子結點 就是要刪除結點,就將this.left = null; 并且就返回(結束遞歸刪除)if(this.left != null && this.left.no == no) {this.left = null;return;}//3.如果當前結點的右子結點不為空,并且右子結點 就是要刪除結點,就將this.right= null ;并且就返回(結束遞歸刪除)if(this.right != null && this.right.no == no) {this.right = null;return;}//4.我們就需要向左子樹進行遞歸刪除if(this.left != null) {this.left.delNode(no);}//5.則應當向右子樹進行遞歸刪除if(this.right != null) {this.right.delNode(no);}}

總結

以上是生活随笔為你收集整理的树节点的遍历,查找,删除(前序,中序,后序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。