一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java編程求二叉樹的鏡像兩種方法介紹

Java編程求二叉樹的鏡像兩種方法介紹

2021-02-07 12:16HankingHu Java教程

這篇文章主要介紹了Java編程求二叉樹的鏡像兩種方法介紹,分享了兩種方法,遞歸與非遞歸,每種方法又分別介紹了兩種解決思路,具有一定參考價值,需要的朋友可以了解下。

給出一棵二叉樹,求它的鏡像,如下圖:右邊是二叉樹是左邊二叉樹的鏡像。

Java編程求二叉樹的鏡像兩種方法介紹

仔細分析這兩棵樹的特點,看看能不能總結出求鏡像的步驟。這兩棵樹的根節點相同,但他們的左右兩個子節點交換了位置。因此我們不妨先在樹中交換根節點的兩個子節點,就得到了下面一幅圖中的第二顆樹

解法1(遞歸)

思路1:如果當前節點為空,返回,否則交換該節點的左右節點,遞歸的對其左右節點進行交換處理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*class treenode{
  int val;
  treenode left=null;
  treenode right=null;
  public treenode(int val) {
    this.val = val;
  }
}*/
public static void mirrortree(treenode root)
  {
    if(root==null)
          return;
    //交換該節點指向的左右節點。
    treenode temp=root.left;
    root.left=root.right;
    root.right=temp;
    //對其左右孩子進行鏡像處理。
    mirrortree(root.left);
    mirrortree(root.right);
}

交換過程如下圖:

Java編程求二叉樹的鏡像兩種方法介紹

交換根節點的兩個子節點之后,我們注意到值為10,6的結點的子節點仍然保持不變,因此我們還需要交換這兩個結點的左右子節點。交換之后的結果分別為第三課樹和第四顆樹。做完這兩次交換之后,我們已經遍歷完所有的非葉子結點。此時交換之后的樹剛好就是原始樹的鏡像。

思路2:如果當前節點為 null,返回 null ,否則先分別對該節點的左右孩子進行鏡像處理,然后將該節點的左指針指向右孩子,右指針指向左孩子,對該節點進行鏡像處理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*class treenode{
  int val;
  treenode left=null;
  treenode right=null;
  public treenode(int val) {
    this.val = val;
  }
}*/
public static treenode mirrortree1(treenode root)
  {
    if(root==null)
          return null;
    //對左右孩子鏡像處理
    treenode left=mirrortree1(root.left);
    treenode right=mirrortree1(root.right);
    //對當前節點進行鏡像處理。
    root.left=right;
    root.right=left;
    return root;
}

解法2(非遞歸)

思路1:層次遍歷,根節點不為 null 將根節點入隊,判斷隊不為空時,節點出隊,交換該節點的左右孩子,如果左右孩子不為空,將左右孩子入隊。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static void mirrortreewithqueue(treenode root)
  {
    if(root==null)
          return;
    //如果樹為 null 直接返回。否則將根節點入隊列。
    queue<treenode> queue= new linkedlist<treenode>() ;
    queue.add(root);
    while(!queue.isempty())
        {
        //隊列不為空時,節點出隊,交換該節點的左右子樹。
        treenode root1=queue.poll();
        /*treenode left,right;
      left=root1.left;
      right=root1.right;
      root1.right=left;
      root1.left=right;
      */
        swap(root);
        if(root1.right!=null)
              {
            queue.add(root1.right);
            //如果左子樹不為 null 入隊
        }
        if(root1.left!=null)
              {
            queue.add(root1.left);
            //如果右子樹不為 null 入隊。
        }
    }
}
public static void swap(treenode root)
  {
    treenode temp;
    temp=root.right;
    root.right=root.left;
    root.left=temp;
}

思路2:先序遍歷,如果根節點不為 null 將根節點入棧,當棧不為 null 出棧,交換左右節點,如果左右節點不為 null 入棧。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static void mirrortreewithstack(treenode root)
  {
    if(root==null)
          return;
    stack<treenode> stack=new stack<treenode>();
    stack.push(root);
    while(!stack.isempty())
        {
        //當棧不為 null 時出棧,交換左右子樹。
        treenode root1=stack.pop();
        /*treenode left,right;
      left=root1.left;
      right=root1.right;
      root1.right=left;
      root1.left=right;*/
        swap(root);
        if(root1.right!=null)
              {
            //右子樹不為 null 入棧
            stack.push(root1.right);
        }
        if(root1.left!=null)
              {
            //左子樹不為 null 入棧
            stack.push(root1.left);
        }
    }
}
public static void swap(treenode root)
  {
    treenode temp;
    temp=root.right;
    root.right=root.left;
    root.left=temp;
}

總結

以上就是本文關于java編程求二叉樹的鏡像兩種方法介紹的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。

原文鏈接:http://blog.csdn.net/u013309870/article/details/69952085

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉精品高清在线观看视频 | 免费观看欧美一级高清 | 成人资源影音先锋久久资源网 | 四虎精品免费国产成人 | free极度另类性欧美 | 2020国产精品永久在线观看 | 美人的淫事[纯hh] | 深夜免费在线视频 | 午夜一区二区免费视频 | futa巨大好爽好长 | 国产欧美久久一区二区 | tube日本高清老少配 | 丰满岳乱妇在线观看视频国产 | 好大好硬好长好爽a网站 | 亚洲444777KKK在线观看 | 大学第一次基本都没了 | 高清视频一区二区三区 | 人与善xuanwen在线400 | 国产一级片免费观看 | 2019nv天堂| 精品视频一区在线观看 | 久久无码人妻AV精品一区 | 日韩精品 欧美 | 国产va免费精品高清在线 | 国产精品视频第一页 | 色cccwww在线播放| 亚洲麻豆精品果冻传媒 | 国产一区二区在线免费观看 | 久久久96 | 91精品国产高清久久久久久 | jzzjlzz亚洲乱熟在线播放 | 免费高清视频日本 | 精品日产1区2卡三卡麻豆 | 99热在这里只有精品 | 日韩日日日 | 3d蒂法受辱在线播放 | 久久精品AV一区二区无码 | 精品国产免费第一区二区三区日韩 | 女人是男人的未来1分49分 | 国产精品久久久天天影视香蕉 | meyd–456佐山爱在线播放 |