題目6
輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個結點的值思路1.使用遞迴。逆序列印a->b->c->d,可以先逆序列印b->c->d(看成新的鍊錶),再列印a;那麼同樣逆序可以先逆序列印c->d,再列印b;直到列印到尾節點。
2.使用棧。棧具有後進先出的特點,剛好符合逆序要求。遍歷鍊錶時將值按順序放入棧中,最後依次出棧。
解法
classlistnode題目7//遞迴法
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;
}
根據二叉樹的前序遍歷和中序遍歷的結果,重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。思路前序遍歷-根左右
中序遍歷-左根右
後序遍歷-左右根
前序遍歷的第乙個值為根節點的值,使用這個值將中序遍歷結果分成兩部分(即在中序遍歷中找到這個值,從而將中序遍歷分成兩部分),左部分為樹的左子樹中序遍歷結果,右部分為右子樹中序遍歷結果。
然後不斷根據左子樹的中序和前序遍歷結果構造左子樹,右子樹同理。
不斷遞迴,得到結果。
解法
class題目8binarytreenode
}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;
}
給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。思路1.如果節點右子樹不為空,那麼該節點的下乙個節點是右子樹的最左節點。
2.如果右子樹不為空,那麼就是第乙個左鏈結指向的樹包含該節點的祖先節點。即沿著指向父節點的指標一路向上遍歷,直到找到乙個是它父節點的左子節點的節點。如果這個節點存在,那麼這個節點的父節點就是下乙個節點。
可以畫出圖來,找規律。
解法
public題目9class
treelinknode
}public
treelinknode getnext(treelinknode tnode)
return
node;
}else
tnode=tnode.next;
}}
return
null
; }
用兩個棧來實現乙個佇列,完成佇列的 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 非遞迴版 ...