劍指offer6 7 8 9 鍊錶 樹 棧

2022-05-21 16:06:11 字數 3626 閱讀 3013

題目6

輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個結點的值
思路1.使用遞迴。逆序列印a->b->c->d,可以先逆序列印b->c->d(看成新的鍊錶),再列印a;那麼同樣逆序可以先逆序列印c->d,再列印b;直到列印到尾節點。

2.使用棧。棧具有後進先出的特點,剛好符合逆序要求。遍歷鍊錶時將值按順序放入棧中,最後依次出棧。

解法

classlistnode

//遞迴法

public voidprintlistreversingbyrecursive(listnode listnode)

system.out.print(listnode.m_nkey+"\t");}}

//棧public voidprintlistreversingbystack(listnode listnode)

while(!stack.empty())

}public arraylistprintlistfromtailtohead(listnode listnode)

return array;

}public arraylistprintlistfromtailtohead(listnode listnode)

while(!stack.isempty())

return array;

}

題目7

根據二叉樹的前序遍歷和中序遍歷的結果,重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
思路前序遍歷-根左右

中序遍歷-左根右

後序遍歷-左右根

前序遍歷的第乙個值為根節點的值,使用這個值將中序遍歷結果分成兩部分(即在中序遍歷中找到這個值,從而將中序遍歷分成兩部分),左部分為樹的左子樹中序遍歷結果,右部分為右子樹中序遍歷結果。

然後不斷根據左子樹的中序和前序遍歷結果構造左子樹,右子樹同理。

不斷遞迴,得到結果。

解法

class

binarytreenode

}public binarytreenode construct(int preorder, int

inorder)

return constructcore(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1

); }

public binarytreenode constructcore(int preorder, int

startpreorder,

int endpreorder, int inorder, int startinorder, int

endinorder)

//前序遍歷的第乙個數字是根節點

binarytreenode root=new

binarytreenode(preorder[startpreorder]);

for(int i=startinorder;i<=endinorder;i++)

}return

root;

}

題目8

給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
思路1.如果節點右子樹不為空,那麼該節點的下乙個節點是右子樹的最左節點。

2.如果右子樹不為空,那麼就是第乙個左鏈結指向的樹包含該節點的祖先節點。即沿著指向父節點的指標一路向上遍歷,直到找到乙個是它父節點的左子節點的節點。如果這個節點存在,那麼這個節點的父節點就是下乙個節點。

可以畫出圖來,找規律。

解法

public

class

treelinknode

}public

treelinknode getnext(treelinknode tnode)

return

node;

}else

tnode=tnode.next;

}}

return

null

; }

題目9

用兩個棧來實現乙個佇列,完成佇列的 push 和 pop 操作。
思路棧:後進先出佇列:先進先出

設定兩個棧,分別用來處理入棧push操作和出棧pop操作。乙個元素進入in棧後,出棧順序被反轉。那麼需要保證正序出棧,就借助out棧,進行一次存放。

輸入a1,a2,a3,則in棧:(棧底)a1,a2,a3(棧頂)

out棧:(棧底)a3,a2,a1(棧頂)

相當於「負負得正」-「逆逆得順」。

解答

stackin=new stack();

stack

out=new stack();

//處理入棧,直接入棧即可

public

void push(int

node)

//處理出棧

public int

pop() throws exception

if(out

.isempty())

throw

new exception("

queue is empty");

//從out棧出棧

return

out.pop();

}

擴充套件堆是程式執行時申請的動態記憶體,而棧只是指一種使用堆的方法。

堆總是一棵完全二叉樹。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

棧/堆疊

只能在棧頂一端進行插入或刪除操作,top()取棧頂操作

佇列

允許在列表的隊尾一端進行插入,隊首一端進行刪除。先進先出

鍊錶

鍊錶中每乙個元素都是乙個物件,每個物件稱為乙個節點,包含有資料域key和指向下乙個節點的指標next。通過各個節點之間的相互連線,最終串聯成乙個鍊錶。

劍指offer 鍊錶

單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...

劍指offer 鍊錶

鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...

劍指offer 鍊錶

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。思路1 遞迴版 class solution 找到當前節點與下乙個節點不重複的點,從不重複的點開始遞迴 return deleteduplication phead next else 思路2 非遞迴版 ...