As per the documentation, if you deploy the contract synchronously, the function returns immediately with a transaction hash, but you'll need to poll the transaction's status until it's mined. (Only then will the contract's address be available.)
As an alternative, you can deploy the contract asynchronously:
VotingContract.new(['Itachi','Luffy','Midoriya'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000}, function (err, deployedContract) {
if (deployedContract.address) {
console.log(`Address: ${deployedContract.address}`);
// use deployedContract here
}
});