看了劍指offer發現乙個問題有好多種思路去解決,之前自己考慮的都太普遍性,應當多樣化的來思考問題
最深體會:寫出實現功能的**,和寫出優異的**是兩回事!
1.鍊錶的倒敘列印
(1)是否可以改變鍊錶結構,可以改變就改變以後列印
(2)不允許改變鍊錶結構可以直接使用迴圈,但是時間複雜度會是o(n)
(3)使用棧來儲存,那麼就會簡單很多,只需要o(n)的時間複雜度
(4)由遞迴和迴圈的關係不難想出其實遞迴也可以解決該問題
用棧解決的方案
void list::resstashow()
while (!s.empty())
}
2.重建二叉樹
輸入二叉樹的前序遍歷和中序遍歷的,請重建出該二叉樹。
12473568
47215386
**如下,輸出函式順序是前序
本題重點
掌握遞迴思想,熟悉前序和中序關係
注意
我的**只實現了兩字元順序匹配的情況,那麼不匹配的時候應當如何呢?
應該加乙個判斷函式,判斷這兩個是否是合適的字串
如果說根節點是null呢?
如果說是特殊的二叉樹呢?
binarytreenode* rebulit(int str1, int str2, int
length)
binarytreenode* p = (binarytreenode*)malloc(sizeof(binarytreenode));
p->m_nvalue = str1[0];
p->m_pleft = null;
p->m_pright = null;
if (length == 1)
int i = 0;
for (i; i < length; ++i)//i=0
}p->m_pleft = rebulit(&str1[1], str2, i);
if (i + 1
< length)
else
return p;
}void rebuilttree(binarytreenode **root, int str1, int str2, int
length)
}p->m_pleft = rebulit(&str1[1], str2, i);
if (i + 1
< length)
}void show(binarytreenode *first)
printf("%d ", first->m_nvalue);
show(first->m_pleft);
show(first->m_pright);
}
3.兩個棧實現佇列(這裡用的是c++懶得寫棧)
#include
#include
using
namespace
std;
class queue
int front()//這個函式想要加判斷的,但是加的話必須返回乙個值,所以就先暫定-1吧,因為我試了下系統的他貌似也是直接報錯,讓執行錯誤
change(&p1, &p2);
int tmp = p2.top();
change(&p2, &p1);//為了可以持續使用變換完了以後還得變回來
return tmp;
}void pop()//注意刪除完了的判斷
change(&p1, &p2);
p2.pop();
change(&p2, &p1);
}private:
stack
p1;
stack
p2;
void change(stack
*p1, stack
*p2)//把p1的值完全放到p2
}};int main()
for (int i = 0; i < 10; ++i)
return
0;}
相應的兩個佇列實現乙個棧的思想其實是一樣的,先進先出換成後進先出罷了。 面試 資料結構
先給出定義部分和相關除錯部分 include h using namespace std struct listnode head listnode insert int v while p next null p p next p next new listnode p p next p next...
《面試》資料結構 python
思想 只限定在資料棧的一端 棧頂 進行元素的操作,是一種特殊的線性表。操作例項 二進位制轉換十進位制 class structure object deftwooten self,l m i len l while i 0 n l i 1 pow 2,len l i i i 1 print sum ...
2019 面試 資料結構
二叉樹是資料結構中一種重要的資料結構,也是樹表家族最為基礎的結構。二叉樹的定義 二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2i 1個結點 深度為k的二叉樹至多有2k 1個結點 對任何一棵二叉樹t,如果其終端結點數為n0,度為2的...