二叉樹中的三種遍歷方式,是我們最為熟知的,通過先序遍歷+中序遍歷或者是中序遍歷+後序遍歷都可以唯一確定一棵二叉樹;但是注意,先序遍歷+後序遍歷不能確定一棵二叉樹,但是如果一棵二叉樹中只有度為0和度為2的節點,那麼這種遍歷方式也是可以確定一棵確定的二叉樹的。
先序+中序–>構造二叉樹
下面我們分別來看一下,根據先序+中序遍歷的順序,如何恢復一棵二叉樹,**如下:
//首先採用遞迴的方式
public treenode buildtree(int preorder, int inorder)
private treenode buildtree(int preorder, int idx, int inorder, int end, int start)
treenode root = new treenode(preorder[idx]);
int i;
//找出根節點,
for (i = end; i >= start; i--)
}//中序陣列中,左子樹集合[start, i-1]
root.left = buildtree(preorder, idx + 1, inorder, i - 1, start);
//中序陣列中,右子樹集合[i+1, end],注意,先序佇列的index,idx為根節點的位置,那麼右子樹只能位於idx的右邊,直到end,但是先序的index的值為idx+i-start+1,因為在上面中序序列分割的左子樹有(i-start)個元素,再加上根節點,所以下面右子樹在先序遍歷序列中的起點位置就是idx+i-start+1 (注意這個部分).
root.right = buildtree(preorder, idx + i - start + 1, inorder, end, i+1);
return root;
}
根節點就是先序遍歷的首節點,找出中序列表中節點對應位置,將中序列表一分為二,再根據中序列表左右子樹的劃分關係來劃分先序列表的左右子樹的關係,這樣就走下去了。
//非遞迴的方式
public treenode buildtree(int preorder, int inorder)
treenode stack = new treenode[len];
boolean flag = new boolean[len];
int k=-1, unsee=-1;
for(int i = 0, j = 0 ; i < len||jif(k<0)elseelse
}k = unsee;
flag[unsee] = true;
j++;
while(unsee>=0&&flag[unsee]==true)
}else}}
for(int i = 0; istack[i].right = stack[i+1];
}return
stack[0];
}
中序+後序–>構造二叉樹
遞迴的方式:
mapmap = new hashmap<>();
public treenode buildtree(int inorder, int postorder)
return dfs(inorder,0,inorder.length,postorder,0,postorder.length-1);
}private treenode dfs(int inorder,int istart,int iend,int postorder,int pstart,int pend)
這段程式中,與上面先序+中序不同的是,採用的hashmap的方式來獲取中序列表中的對應值的索引,兩種方式都比較好理解;具體的遞迴思想,跟上面類似,不在贅述。
非遞迴方式
public treenode buildtree(int inorder, int postorder) else
int ia = arrays.copyofrange(inorder, i+1, i+1+k-j);
int pa = arrays.copyofrange(postorder, j, k);
node = buildtree(ia, pa);
root.right=node;
i=k+1;
j=k+1;}}
return root;
}
關於遞迴
在二叉樹的操作中,遞迴的使用很是普遍,遞迴**很是簡潔,也比較容易理解,但是遞迴這種思想最系統堆疊要求是很高的,當資料量大一點之後,可能很容易就出現堆疊溢位,所以將遞迴程式改寫成為非遞迴程式是很有必要的,非遞迴程式雖然比較複雜,**量較大,但是具有普適性。
二叉樹 根據二叉樹遍歷序列構造二叉樹
二叉樹的節點型別宣告如下 struct btnode 定理1任何 n 0 個不同節點的二叉樹,都可由它的前序序列和中序序列唯一地確定。根據前序遍歷的特點,知前序序列 presequence 的首個元素 presequence 0 為二叉樹的根 root 然後在中序序列 insequence 中查詢此...
重建二叉樹,根據前序中序遍歷構建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序遍歷 根左右 中序遍歷 左根右 根據前序遍歷我們可以知道根節點,根據中序遍歷我們可以知道根節點的左右子樹結點有哪些。如 前序 中...
二叉樹 二叉樹遍歷 根據先序建立二叉樹
題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結輸入 輸入包括1行字串,長度不超過100。輸出 可能有多組測試資...