劍指Offer 面試題19 二叉樹的映象

2021-06-25 12:39:49 字數 2585 閱讀 7084

/*

二叉樹的映象:

請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。

輸入:輸入可能包含多個測試樣例,輸入以eof結束。

對於每個測試案例,輸入的第一行為乙個整數n(0<=n<=1000,n代表將要輸入的二叉樹節點的個數(節點從1開始編號)。接下來一行有n個數字,代表第i個二叉樹節點的元素的值。接下來有n行,每行有乙個字母ci。

ci=』d』表示第i個節點有兩子孩子,緊接著是左孩子編號和右孩子編號。

ci=』l』表示第i個節點有乙個左孩子,緊接著是左孩子的編號。

ci=』r』表示第i個節點有乙個右孩子,緊接著是右孩子的編號。

ci=』z』表示第i個節點沒有子孩子。

輸出:對應每個測試案例,

按照前序輸出其孩子節點的元素值。

若為空輸出null。

樣例輸入:

78 6 10 5 7 9 11

d 2 3

d 4 5

d 6 7zz

zz樣例輸出:

8 10 11 9 6 7 5

關鍵:遞迴的出口是:節點值為空

遞迴主體:

如果當前節點有左孩子和右孩子,則互相交換;

如果該節點只有乙個孩子(左或者右),直接稱為該節點另乙個孩子

需要重新建一棵樹嗎?還是在原有已經建好樹的基礎上修改。

因為修改只涉及到子父節點的指向問題,因此不需要重新建樹。

node* left = root->_left;node* right = root->_right;

root->_left = right;root->_right = left;

*//*

關鍵:1 cin >> ch;//注意,scanf接受%c時,不會過濾空格,其他控制字元會過濾。10為換行,13為回車。下次碰到字元,立即用c++,別用c

2 if(phead->_left == null && phead->_right == null)//對於左右孩子均為空的情況,直接返回

3 treenode* pleft = phead->_left;//接下來不管左右孩子是否乙個為空還是均不空,都需要賦值,否則就出錯了

phead->_left = phead->_right;

phead->_right = pleft;

if(phead->_left)//如果左子樹不空,遞迴遍歷左子樹

*/#include #include #include const int maxsize = 1002;

using namespace std;

typedef struct treenode

treenode;

treenode nodearr[maxsize];

int _iindex;

treenode* createnode()

void buildtree(treenode** phead,int* parr,int n)

//對每個節點進行賦值

for(int j = 0 ; j < n ;j++)

else//對頭結點賦值

}int ileft,iright;

for(int i = 1 ; i <= n ; i++)//建立父子結點之間的指向

//printf("%c",ch);

switch (ch)}}

void binarytreemirrorimage(treenode* phead)

if(phead->_left == null && phead->_right == null)//對於左右孩子均為空的情況,直接返回

treenode* pleft = phead->_left;//接下來不管左右孩子是否乙個為空還是均不空,都需要賦值,否則就出錯了

phead->_left = phead->_right;

phead->_right = pleft;

if(phead->_left)//如果左子樹不空,遞迴遍歷左子樹

if(phead->_right)

}bool isfirst;

void frontvisit(treenode* phead)

if(!isfirst)//不是第一次進入

else//第一次進入

frontvisit(phead->_left);

frontvisit(phead->_right);

}void process()

int iarr[maxsize];

for(int i = 0 ; i < n ; i++)

_iindex = 0;

memset(nodearr,null,sizeof(nodearr));

treenode* head = createnode();

treenode** phead = &head;

buildtree(phead,iarr,n);

binarytreemirrorimage(head);

isfirst = true;

frontvisit(head);

printf("\n");}}

int main(int argc,char* argv)

劍指Offer 面試題19 映象二叉樹

操作給定的二叉樹,將其變換為源二叉樹的映象。以題目中的兩棵樹為例 就是先序遍歷這棵樹,如果當前正在遍歷的節點有子結點 無論是左還是右 就交換兩個子節點,當交換完所有的非葉子結點的左右子結點的時候,就得到了樹的映象.具體過程如下所示 注意6和10交換之後,第三層結點的排列順序 遞迴實現 public ...

劍指offer面試題19 二叉樹的映象

解題思路 1 遞迴實現 利用中序遍歷的思想,在遍歷到每乙個節點的同時,如果這個節點不為空或者這個節點不為葉子節點,將其看做根節點,交換其左右子樹的指標的位置。直到遞迴返回到根節點為止,形成二叉樹的映象。class treenode 求二叉樹的映象 public class solution 葉子節點...

劍指offer 面試題19 二叉樹的映象

題目 操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5 1 遞迴方法 struct treenode class solution 分析 先序遍歷這棵樹,如果遍歷到的結點有子節點,就交換它的子結點。當交...